diff options
author | Alan Modra <amodra@bigpond.net.au> | 2011-04-20 00:11:28 +0000 |
---|---|---|
committer | Alan Modra <amodra@bigpond.net.au> | 2011-04-20 00:11:28 +0000 |
commit | 03b9ecd2c9ea9ed1fd5dbd6a1af9d55719b00132 (patch) | |
tree | e727938339faa2b08f14f837fc572b939250bb8c /ld/plugin.c | |
parent | 7e0d731aa891fb9c6b3b5813dbe6b45f2a94d28d (diff) | |
download | binutils-redhat-03b9ecd2c9ea9ed1fd5dbd6a1af9d55719b00132.tar.gz |
PR ld/12365
include/
* bfdlink.h (struct bfd_link_callbacks): Modify multiple_definition
and multiple_common parameters to pass in a bfd_link_hash_entry
pointer rather than name,bfd etc. found in the hash entry.
bfd/
* elflink.c (_bfd_elf_merge_symbol): Update multiple_common calls.
* linker.c (_bfd_generic_link_add_one_symbol): Likewise. Call
multiple_definition regardless of allow_multiple_definition.
* simple.c (simple_dummy_multiple_definition): Update.
* xcofflink.c (xcoff_link_add_symbols): Update multiple_definition
calls.
ld/
* ldmain.c (multiple_definition): Take a bfd_link_hash_entry
pointer arg rather than "name", "obfd", "osec", "oval". Add code
removed from linker.c. Hack around xcofflink.c oddity in
passing NULL nbfd.
(multiple_common): Similarly.
* plugin.c (orig_allow_multiple_defs): Delete.
(plugin_call_all_symbols_read): Don't twiddle allow_multiple_definition.
(plugin_multiple_definition): Update.
Diffstat (limited to 'ld/plugin.c')
-rw-r--r-- | ld/plugin.c | 39 |
1 files changed, 10 insertions, 29 deletions
diff --git a/ld/plugin.c b/ld/plugin.c index 07f3afe998..b363bc104f 100644 --- a/ld/plugin.c +++ b/ld/plugin.c @@ -97,10 +97,8 @@ static const char *error_plugin = NULL; cases when establishing symbol resolutions. */ static struct bfd_hash_table *non_ironly_hash = NULL; -/* State of linker "notice" and "multiple_definition" interfaces - before we poked at them. */ +/* State of linker "notice" interface before we poked at it. */ static bfd_boolean orig_notice_all; -static bfd_boolean orig_allow_multiple_defs; /* Original linker callbacks, and the plugin version. */ static const struct bfd_link_callbacks *orig_callbacks; @@ -138,9 +136,8 @@ static bfd_boolean plugin_notice (struct bfd_link_info *info, const char *name, bfd *abfd, asection *section, bfd_vma value); static bfd_boolean plugin_multiple_definition (struct bfd_link_info *info, - const char *name, - bfd *obfd, asection *osec, - bfd_vma oval, bfd *nbfd, + struct bfd_link_hash_entry *h, + bfd *nbfd, asection *nsec, bfd_vma nval); @@ -847,12 +844,6 @@ plugin_call_all_symbols_read (void) /* Disable any further file-claiming. */ no_more_claiming = TRUE; - /* If --allow-multiple-definition is in effect, we need to disable it, - as the plugin infrastructure relies on the multiple_definition - callback to swap out the dummy IR-only BFDs for new real ones - when it starts opening the files added during this callback. */ - orig_allow_multiple_defs = link_info.allow_multiple_definition; - link_info.allow_multiple_definition = FALSE; plugin_callbacks.multiple_definition = &plugin_multiple_definition; while (curplug) @@ -949,28 +940,18 @@ plugin_notice (struct bfd_link_info *info, we've fixed it up, or anyway if --allow-multiple-definition was in effect (before we disabled it to ensure we got called back). */ static bfd_boolean -plugin_multiple_definition (struct bfd_link_info *info, const char *name, - bfd *obfd, asection *osec, bfd_vma oval, +plugin_multiple_definition (struct bfd_link_info *info, + struct bfd_link_hash_entry *h, bfd *nbfd, asection *nsec, bfd_vma nval) { - if (is_ir_dummy_bfd (obfd)) + if (h->type == bfd_link_hash_defined + && is_ir_dummy_bfd (h->u.def.section->owner)) { - struct bfd_link_hash_entry *blhe - = bfd_link_hash_lookup (info->hash, name, FALSE, FALSE, FALSE); - if (!blhe) - einfo (_("%P%X: %s: can't find IR symbol '%s'\n"), nbfd->filename, - name); - else if (blhe->type != bfd_link_hash_defined) - einfo (_("%P%x: %s: bad IR symbol type %d\n"), name, blhe->type); /* Replace it with new details. */ - blhe->u.def.section = nsec; - blhe->u.def.value = nval; + h->u.def.section = nsec; + h->u.def.value = nval; return TRUE; } - if (orig_allow_multiple_defs) - return TRUE; - - return (*orig_callbacks->multiple_definition) (info, name, obfd, osec, oval, - nbfd, nsec, nval); + return (*orig_callbacks->multiple_definition) (info, h, nbfd, nsec, nval); } |