(_bfd_elf_write_section_eh_frame): Do proper
authorAndreas Schwab <schwab@linux-m68k.org>
Sun, 24 Aug 2008 21:43:00 +0000 (21:43 +0000)
committerAndreas Schwab <schwab@linux-m68k.org>
Sun, 24 Aug 2008 21:43:00 +0000 (21:43 +0000)
extension when calculating difference of offsets.

bfd/ChangeLog
bfd/elf-eh-frame.c

index bf9d5802284eca305e8842754feb5de706b2162e..5c34381195a8f7ce91a110b921415d62c86e9451 100644 (file)
@@ -1,3 +1,8 @@
+2008-08-24  Andreas Schwab  <schwab@suse.de>
+
+       * elf-eh-frame.c (_bfd_elf_write_section_eh_frame): Do proper
+       extension when calculating difference of offsets.
+
 2008-08-24  Alan Modra  <amodra@bigpond.net.au>
 
        * configure.in: Update a number of obsolete autoconf macros.
index 9b88499e486fff0218f496adb37de3bcb6a0b32b..7151a397635c583d7830959238184e8205d9c334 100644 (file)
@@ -1445,7 +1445,7 @@ _bfd_elf_write_section_eh_frame (bfd *abfd,
 
                        val = read_value (abfd, buf, per_width,
                                          get_DW_EH_PE_signed (per_encoding));
-                       val += ent->offset - ent->new_offset;
+                       val += (bfd_vma) ent->offset - ent->new_offset;
                        val -= extra_string + extra_data;
                        write_value (abfd, buf, val, per_width);
                        action &= ~4;
@@ -1504,7 +1504,7 @@ _bfd_elf_write_section_eh_frame (bfd *abfd,
                  }
                  break;
                case DW_EH_PE_pcrel:
-                 value += ent->offset - ent->new_offset;
+                 value += (bfd_vma) ent->offset - ent->new_offset;
                  address += (sec->output_section->vma
                              + sec->output_offset
                              + ent->offset + 8);
@@ -1538,7 +1538,7 @@ _bfd_elf_write_section_eh_frame (bfd *abfd,
              if (value)
                {
                  if ((ent->lsda_encoding & 0xf0) == DW_EH_PE_pcrel)
-                   value += ent->offset - ent->new_offset;
+                   value += (bfd_vma) ent->offset - ent->new_offset;
                  else if (cie->u.cie.make_lsda_relative)
                    value -= (sec->output_section->vma
                              + sec->output_offset
@@ -1577,7 +1577,7 @@ _bfd_elf_write_section_eh_frame (bfd *abfd,
                    continue;
 
                  if ((ent->fde_encoding & 0xf0) == DW_EH_PE_pcrel)
-                   value += ent->offset + 8 - new_offset;
+                   value += (bfd_vma) ent->offset + 8 - new_offset;
                  if (ent->make_relative)
                    value -= (sec->output_section->vma
                              + sec->output_offset