summaryrefslogtreecommitdiff
path: root/bfd/cofflink.c
diff options
context:
space:
mode:
authorDave Korn <dave.korn@artimi.com>2011-05-07 14:29:08 +0000
committerDave Korn <dave.korn@artimi.com>2011-05-07 14:29:08 +0000
commitae7b4f9b7dacd33c71f72c69962b7e3d527258dd (patch)
tree4c76058d2065f93c931d89041e7867bc16f22ec7 /bfd/cofflink.c
parent8c1b430909e48c66c596fe400b3f3d09559027f2 (diff)
downloadbinutils-redhat-ae7b4f9b7dacd33c71f72c69962b7e3d527258dd.tar.gz
bfd/ChangeLog:
PR ld/12365 * cofflink.c (bfd_coff_link_input_bfd): Check for and warn about references to symbols defined in discarded sections. ld/ChangeLog: PR ld/12365 * scripttempl/pe.sc (__rt_psrelocs_start): New symbol definition. (__rt_psrelocs_end): Likewise. (__rt_psrelocs_size): Likewise difference between the above. (__RUNTIME_PSEUDO_RELOC_LIST_END__): Move outside .rdata section immediately after end of pseudo-reloc data. (___RUNTIME_PSEUDO_RELOC_LIST_END___): Likewise. (__RUNTIME_PSEUDO_RELOC_LIST__): Move outside .rdata section and calculate backward from list end. (___RUNTIME_PSEUDO_RELOC_LIST___): Likewise. * scripttempl/pep.sc: Likewise. ld/testsuite/ChangeLog: PR ld/12365 * ld-plugin/plugin-7.d: Allow underscore in error message. * ld-plugin/plugin-8.d: Likewise.
Diffstat (limited to 'bfd/cofflink.c')
-rw-r--r--bfd/cofflink.c29
1 files changed, 29 insertions, 0 deletions
diff --git a/bfd/cofflink.c b/bfd/cofflink.c
index 33de7fe3cc..fdfab1de48 100644
--- a/bfd/cofflink.c
+++ b/bfd/cofflink.c
@@ -2365,6 +2365,35 @@ _bfd_coff_link_input_bfd (struct coff_final_link_info *finfo, bfd *input_bfd)
if (internal_relocs == NULL)
return FALSE;
+ /* Run through the relocs looking for relocs against symbols
+ coming from discarded sections and complain about them. */
+ irel = internal_relocs;
+ for (; irel < &internal_relocs[o->reloc_count]; irel++)
+ {
+ struct coff_link_hash_entry *h;
+ asection *ps = NULL;
+ long symndx = irel->r_symndx;
+ if (symndx < 0)
+ continue;
+ h = obj_coff_sym_hashes (input_bfd)[symndx];
+ if (h == NULL)
+ continue;
+ while (h->root.type == bfd_link_hash_indirect
+ || h->root.type == bfd_link_hash_warning)
+ h = (struct coff_link_hash_entry *) h->root.u.i.link;
+ if (h->root.type == bfd_link_hash_defined
+ || h->root.type == bfd_link_hash_defweak)
+ ps = h->root.u.def.section;
+ if (ps == NULL)
+ continue;
+ /* Complain if definition comes from an excluded section. */
+ if (ps->flags & SEC_EXCLUDE)
+ (*finfo->info->callbacks->einfo)
+ (_("%X`%s' referenced in section `%A' of %B: "
+ "defined in discarded section `%A' of %B\n"),
+ h->root.root.string, o, input_bfd, ps, ps->owner);
+ }
+
/* Call processor specific code to relocate the section
contents. */
if (! bfd_coff_relocate_section (output_bfd, finfo->info,