aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2004-08-25 14:35:58 +0000
committerAlan Modra <amodra@gmail.com>2004-08-25 14:35:58 +0000
commitf855931bbd914039754674f6f582a7236583f62b (patch)
treec9e5d655cbbebbb33fb1a58920c2045430a81981
parentb18c562e39c5c3ee63032a9a0aa9b7571343fd58 (diff)
downloadgdb-f855931bbd914039754674f6f582a7236583f62b.zip
gdb-f855931bbd914039754674f6f582a7236583f62b.tar.gz
gdb-f855931bbd914039754674f6f582a7236583f62b.tar.bz2
* elf32-i386.c (elf_i386_relocate_section): Zero section contents
for R_386_32 and R_386_PC32 relocs against symbols defined in discarded sections.
-rw-r--r--bfd/ChangeLog8
-rw-r--r--bfd/elf32-i386.c15
2 files changed, 20 insertions, 3 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index a0a9fc4..dbe1df9 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,9 +1,15 @@
+2004-08-25 Alan Modra <amodra@bigpond.net.au>
+
+ * elf32-i386.c (elf_i386_relocate_section): Zero section contents
+ for R_386_32 and R_386_PC32 relocs against symbols defined in
+ discarded sections.
+
2004-08-25 Dmitry Diky <diwil@spec.ru>
* reloc.c (BFD_RELOC_MSP430_2X_PCREL,BFD_RELOC_MSP430_RL_PCREL):
Add new relocations.
* bfd-in2.h: Regenerate.
- * libbfd.h: Regenerate..
+ * libbfd.h: Regenerate.
* elf32-msp430.c: Clean-up code.
(elf_msp430_howto_table): Add new relocation entries.
(bfd_elf32_bfd_reloc_type_lookup): New relocation handlers.
diff --git a/bfd/elf32-i386.c b/bfd/elf32-i386.c
index 5eb34ab..855b985 100644
--- a/bfd/elf32-i386.c
+++ b/bfd/elf32-i386.c
@@ -2319,8 +2319,19 @@ elf_i386_relocate_section (bfd *output_bfd,
/* r_symndx will be zero only for relocs against symbols
from removed linkonce sections, or sections discarded by
a linker script. */
- if (r_symndx == 0
- || (input_section->flags & SEC_ALLOC) == 0)
+ if (r_symndx == 0)
+ {
+ /* Zero the section contents. eh_frame generated by old
+ versions of gcc isn't edited by elf-eh-frame.c, so
+ FDEs for discarded linkonce functions might remain.
+ Putting zeros here will zero such FDE's address range.
+ This is a hint to unwinders and other consumers of
+ exception handling info that the FDE is invalid. */
+ bfd_put_32 (input_bfd, 0, contents + rel->r_offset);
+ continue;
+ }
+
+ if ((input_section->flags & SEC_ALLOC) == 0)
break;
if ((info->shared