This is the mail archive of the
binutils-cvs@sourceware.org
mailing list for the binutils project.
[binutils-gdb] Fix seg-fault in linker when applying relocs to a corrupt binary.
- From: Nick Clifton <nickc at sourceware dot org>
- To: bfd-cvs at sourceware dot org
- Date: 2 Dec 2016 15:03:55 -0000
- Subject: [binutils-gdb] Fix seg-fault in linker when applying relocs to a corrupt binary.
https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=fe6fae079099c0eeb3186086d6b150800c0e8770
commit fe6fae079099c0eeb3186086d6b150800c0e8770
Author: Nick Clifton <nickc@redhat.com>
Date: Fri Dec 2 15:03:05 2016 +0000
Fix seg-fault in linker when applying relocs to a corrupt binary.
PR ld/20911
* ldctor.c (ldctor_build_sets): Produce alternative error message
if the reloc was being applied to a special section.
Diff:
---
ld/ChangeLog | 4 ++++
ld/ldctor.c | 15 +++++++++++----
2 files changed, 15 insertions(+), 4 deletions(-)
diff --git a/ld/ChangeLog b/ld/ChangeLog
index e9734ac..1d1c91a 100644
--- a/ld/ChangeLog
+++ b/ld/ChangeLog
@@ -1,5 +1,9 @@
2016-12-02 Nick Clifton <nickc@redhat.com>
+ PR ld/20911
+ * ldctor.c (ldctor_build_sets): Produce alternative error message
+ if the reloc was being applied to a special section.
+
PR ld/20912
* emultempl/elf32.em (_place_orphan): Test for ELF format of the
orphan before looking for the SHF_EXCLUDE flag.
diff --git a/ld/ldctor.c b/ld/ldctor.c
index 2075ad3..505702a 100644
--- a/ld/ldctor.c
+++ b/ld/ldctor.c
@@ -290,10 +290,17 @@ ldctor_build_sets (void)
p->reloc);
if (howto == NULL)
{
- einfo (_("%P%X: %s does not support reloc %s for set %s\n"),
- bfd_get_target (p->elements->section->owner),
- bfd_get_reloc_code_name (p->reloc),
- p->h->root.string);
+ /* See PR 20911 for a reproducer. */
+ if (p->elements->section->owner == NULL)
+ einfo (_("%P%X: Special section %s does not support reloc %s for set %s\n"),
+ bfd_get_section_name (link_info.output_bfd, p->elements->section),
+ bfd_get_reloc_code_name (p->reloc),
+ p->h->root.string);
+ else
+ einfo (_("%P%X: %s does not support reloc %s for set %s\n"),
+ bfd_get_target (p->elements->section->owner),
+ bfd_get_reloc_code_name (p->reloc),
+ p->h->root.string);
continue;
}
}