summaryrefslogtreecommitdiffstats
path: root/bfd/elf-eh-frame.c
diff options
context:
space:
mode:
authorJan Kratochvil <jan.kratochvil@redhat.com>2008-09-17 07:50:29 +0000
committerJan Kratochvil <jan.kratochvil@redhat.com>2008-09-17 07:50:29 +0000
commit2a7b2e88e38cbd83225e9c3b28a990de56dccef7 (patch)
tree5a8ae06b9f452694184c05f9b9576ccc36c6266a /bfd/elf-eh-frame.c
parent32649b97b910a25743777a9ef0c7ba2a0bae3e35 (diff)
downloadppe42-binutils-2a7b2e88e38cbd83225e9c3b28a990de56dccef7.tar.gz
ppe42-binutils-2a7b2e88e38cbd83225e9c3b28a990de56dccef7.zip
bfd/
PR 6893 - Do not consider FDEs for discarded sections as invalid. * elf-eh-frame.c (_bfd_elf_parse_eh_frame): New REQUIRE_CLEARED_RELOCS. Consider FDEs with cleared relocations as valid and ignorable. ld/testsuite/ * ld-elf/eh-group.exp, ld-elf/eh-group1.s, ld-elf/eh-group2.s: New test. binutils/ Suppress warnings on NONE relocations to discarded sections. * readelf.c (is_none_reloc): New function. (debug_apply_relocations): Ignore is_none_reloc() relocations.
Diffstat (limited to 'bfd/elf-eh-frame.c')
-rw-r--r--bfd/elf-eh-frame.c33
1 files changed, 29 insertions, 4 deletions
diff --git a/bfd/elf-eh-frame.c b/bfd/elf-eh-frame.c
index 7151a39763..579a6b8967 100644
--- a/bfd/elf-eh-frame.c
+++ b/bfd/elf-eh-frame.c
@@ -549,6 +549,16 @@ _bfd_elf_parse_eh_frame (bfd *abfd, struct bfd_link_info *info,
< (bfd_size_type) ((buf) - ehbuf))) \
cookie->rel++
+#define REQUIRE_CLEARED_RELOCS(buf) \
+ while (cookie->rel < cookie->relend \
+ && (cookie->rel->r_offset \
+ < (bfd_size_type) ((buf) - ehbuf))) \
+ { \
+ REQUIRE (cookie->rel->r_info == 0); \
+ REQUIRE (cookie->rel->r_addend == 0); \
+ cookie->rel++; \
+ }
+
#define GET_RELOC(buf) \
((cookie->rel < cookie->relend \
&& (cookie->rel->r_offset \
@@ -766,9 +776,14 @@ _bfd_elf_parse_eh_frame (bfd *abfd, struct bfd_link_info *info,
/* Chain together the FDEs for each section. */
rsec = _bfd_elf_gc_mark_rsec (info, sec, gc_mark_hook, cookie);
- REQUIRE (rsec && rsec->owner == abfd);
- this_inf->u.fde.next_for_section = elf_fde_list (rsec);
- elf_fde_list (rsec) = this_inf;
+ /* RSEC will be NULL if FDE was cleared out as it was belonging to
+ a discarded SHT_GROUP. */
+ if (rsec)
+ {
+ REQUIRE (rsec->owner == abfd);
+ this_inf->u.fde.next_for_section = elf_fde_list (rsec);
+ elf_fde_list (rsec) = this_inf;
+ }
/* Skip the initial location and address range. */
start = buf;
@@ -801,7 +816,17 @@ _bfd_elf_parse_eh_frame (bfd *abfd, struct bfd_link_info *info,
insns = buf;
buf = last_fde + 4 + hdr_length;
- SKIP_RELOCS (buf);
+
+ /* Cleared FDE? The instructions will not be cleared but verify all
+ the relocation entries for them are cleared. */
+ if (rsec == NULL)
+ {
+ REQUIRE_CLEARED_RELOCS (buf);
+ }
+ else
+ {
+ SKIP_RELOCS (buf);
+ }
}
/* Try to interpret the CFA instructions and find the first
OpenPOWER on IntegriCloud