aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2014-03-14 15:01:53 +1030
committerAlan Modra <amodra@gmail.com>2014-03-14 15:01:53 +1030
commitc3301df1daed30afd62d8d2f8895d5aadfafb514 (patch)
treee7c33aaf2dbbfa7061345ebf4d02bea55da075f1
parentd4ae5fb0b5d1ae4270b3343509e8bd2d529aa291 (diff)
downloadgdb-c3301df1daed30afd62d8d2f8895d5aadfafb514.zip
gdb-c3301df1daed30afd62d8d2f8895d5aadfafb514.tar.gz
gdb-c3301df1daed30afd62d8d2f8895d5aadfafb514.tar.bz2
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.
-rw-r--r--bfd/ChangeLog5
-rw-r--r--bfd/elf32-ppc.c12
-rw-r--r--ld/testsuite/ChangeLog5
-rw-r--r--ld/testsuite/ld-powerpc/vle-reloc-3.d2
-rw-r--r--ld/testsuite/ld-powerpc/vle.ld3
5 files changed, 20 insertions, 7 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 168c84f..bde7262 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -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
diff --git a/bfd/elf32-ppc.c b/bfd/elf32-ppc.c
index 750aa5e..868fe50 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 1d039e4..e4e669b 100644
--- a/ld/testsuite/ChangeLog
+++ b/ld/testsuite/ChangeLog
@@ -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
diff --git a/ld/testsuite/ld-powerpc/vle-reloc-3.d b/ld/testsuite/ld-powerpc/vle-reloc-3.d
index e29f4f0..584c483 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 <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
diff --git a/ld/testsuite/ld-powerpc/vle.ld b/ld/testsuite/ld-powerpc/vle.ld
index 01b6598..ff92a05 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/ : { *(*) }
}