From c3301df1daed30afd62d8d2f8895d5aadfafb514 Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Fri, 14 Mar 2014 15:01:53 +1030 Subject: [PATCH] Fix overflow handling of VLE_SDA21 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 | 5 +++++ bfd/elf32-ppc.c | 12 +++++++----- ld/testsuite/ChangeLog | 5 +++++ ld/testsuite/ld-powerpc/vle-reloc-3.d | 2 +- ld/testsuite/ld-powerpc/vle.ld | 3 ++- 5 files changed, 20 insertions(+), 7 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 168c84f428c..bde7262b01d 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,8 @@ +2014-03-14 Alan Modra + + * elf32-ppc.c (ppc_elf_relocate_section): Correct overflow + handling for VLE_SDA21 relocs. + 2014-03-13 Tristan Gingold * peicode.h (pe_ILF_object_p): Adjust, as the version number diff --git a/bfd/elf32-ppc.c b/bfd/elf32-ppc.c index 750aa5e7bc6..868fe507009 100644 --- a/bfd/elf32-ppc.c +++ b/bfd/elf32-ppc.c @@ -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 diff --git a/ld/testsuite/ChangeLog b/ld/testsuite/ChangeLog index 1d039e43216..e4e669bbc39 100644 --- a/ld/testsuite/ChangeLog +++ b/ld/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2014-03-14 Alan Modra + + * ld-powerpc/vle.ld: Place .PPC.EMB.sdata0 within 32k of 0. + * ld-powerpc/vle-reloc-3.d: Update. + 2014-03-06 Roland McGrath * ld-arm/gc-hidden-1.d: Remove target, add not-target to match diff --git a/ld/testsuite/ld-powerpc/vle-reloc-3.d b/ld/testsuite/ld-powerpc/vle-reloc-3.d index e29f4f07864..584c4833d1f 100644 --- a/ld/testsuite/ld-powerpc/vle-reloc-3.d +++ b/ld/testsuite/ld-powerpc/vle-reloc-3.d @@ -5,4 +5,4 @@ Disassembly of section .text: 01800094 : 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 diff --git a/ld/testsuite/ld-powerpc/vle.ld b/ld/testsuite/ld-powerpc/vle.ld index 01b659857b2..ff92a05e078 100644 --- a/ld/testsuite/ld-powerpc/vle.ld +++ b/ld/testsuite/ld-powerpc/vle.ld @@ -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/ : { *(*) } } -- 2.30.2