Fix overflow handling of VLE_SDA21
authorAlan Modra <amodra@gmail.com>
Fri, 14 Mar 2014 04:31:53 +0000 (15:01 +1030)
committerAlan Modra <amodra@gmail.com>
Fri, 14 Mar 2014 04:31:53 +0000 (15:01 +1030)
bfd/
* elf32-ppc.c (ppc_elf_relocate_section): Correct overflow
handling for VLE_SDA21 relocs.
ld/testsuite/
* ld-powerpc/vle.ld: Place .PPC.EMB.sdata0 within 32k of 0.
* ld-powerpc/vle-reloc-3.d: Update.

bfd/ChangeLog
bfd/elf32-ppc.c
ld/testsuite/ChangeLog
ld/testsuite/ld-powerpc/vle-reloc-3.d
ld/testsuite/ld-powerpc/vle.ld

index 168c84f428cce0d7766592cc47f1c225e397870a..bde7262b01dbcdfd0107846abdbc36ce73875d50 100644 (file)
@@ -1,3 +1,8 @@
+2014-03-14  Alan Modra  <amodra@gmail.com>
+
+       * elf32-ppc.c (ppc_elf_relocate_section): Correct overflow
+       handling for VLE_SDA21 relocs.
+
 2014-03-13  Tristan Gingold  <gingold@adacore.com>
 
        * peicode.h (pe_ILF_object_p): Adjust, as the version number
index 750aa5e7bc6cbfcaec48a150776fc8aa949b154a..868fe5070092a655b164dee378525781bc169286 100644 (file)
@@ -8859,11 +8859,12 @@ ppc_elf_relocate_section (bfd *output_bfd,
                /* And the final 11 bits of the value to bits 21 to 31.  */
                insn |= relocation & 0x7ff;
 
-               /* Use _bfd_final_link_relocate to report overflow,
-                  but do so with a value that won't modify the insn.  */
-               if (relocation + 0x80000 > 0x100000)
-                 addend = 0x100000;
-               relocation = 0;
+               bfd_put_32 (output_bfd, insn, contents + rel->r_offset);
+
+               if (r_type == R_PPC_VLE_SDA21
+                   && ((relocation + 0x80000) & 0xffffffff) > 0x100000)
+                 goto overflow;
+               continue;
              }
            else if (r_type == R_PPC_EMB_SDA21
                     || r_type == R_PPC_VLE_SDA21
@@ -9160,6 +9161,7 @@ ppc_elf_relocate_section (bfd *output_bfd,
        {
          if (r == bfd_reloc_overflow)
            {
+           overflow:
              if (warned)
                continue;
              if (h != NULL
index 1d039e4321698c322a11b75625bcce41ce12fa99..e4e669bbc394a7f2f298a01817262c194605bc5d 100644 (file)
@@ -1,3 +1,8 @@
+2014-03-14  Alan Modra  <amodra@gmail.com>
+
+       * ld-powerpc/vle.ld: Place .PPC.EMB.sdata0 within 32k of 0.
+       * ld-powerpc/vle-reloc-3.d: Update.
+
 2014-03-06  Roland McGrath  <mcgrathr@google.com>
 
        * ld-arm/gc-hidden-1.d: Remove target, add not-target to match
index e29f4f07864b287712fe5ae4512df1beb233ddb3..584c4833d1f336ca58e35773b708c2c4a5bdbdb2 100644 (file)
@@ -5,4 +5,4 @@ Disassembly of section .text:
 01800094 <sda21_test>:
  1800094:      1c ad 80 08     e_add16i r5,r13,-32760
  1800098:      1c a2 80 04     e_add16i r5,r2,-32764
- 180009c:      70 00 00 ac     e_li    r0,172
+ 180009c:      70 b0 78 04     e_li    r5,-32764
index 01b659857b273c8b03e871a9ca7d566274831340..ff92a05e0789524240988b4d8e59ad47c121c0a6 100644 (file)
@@ -2,10 +2,11 @@ SECTIONS
 {
   . = 0x01800000 + SIZEOF_HEADERS;
   .text : { *(.text) }
-  .PPC.EMB.sdata0 : { *(.PPC.EMB.sdata0) }
   .sdata2 : { PROVIDE (_SDA2_BASE_ = 32768); *(.sdata2) }
   . = ALIGN (0x10000) + (. & (0x10000 - 1));
   .data : { *(.data) }
   .sdata : { PROVIDE (_SDA_BASE_ = 32768); *(.sdata) }
+  . = 0xffff8000;
+  .PPC.EMB.sdata0 : { *(.PPC.EMB.sdata0) }
   /DISCARD/ : { *(*) }
 }