1 /* Plugin control for the GNU linker.
2 Copyright 2010, 2011 Free Software Foundation, Inc.
4 This file is part of the GNU Binutils.
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 3 of the License, or
9 (at your option) any later version.
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
19 MA 02110-1301, USA. */
22 #include "libiberty.h"
33 #include "plugin-api.h"
35 #if !defined (HAVE_DLFCN_H) && defined (HAVE_WINDOWS_H)
39 /* Report plugin symbols. */
40 bfd_boolean report_plugin_symbols;
42 /* The suffix to append to the name of the real (claimed) object file
43 when generating a dummy BFD to hold the IR symbols sent from the
44 plugin. For cosmetic use only; appears in maps, crefs etc. */
45 #define IRONLY_SUFFIX " (symbol from plugin)"
47 /* Stores a single argument passed to a plugin. */
48 typedef struct plugin_arg
50 struct plugin_arg *next;
54 /* Holds all details of a single plugin. */
57 /* Next on the list of plugins, or NULL at end of chain. */
59 /* The argument string given to --plugin. */
61 /* The shared library handle returned by dlopen. */
63 /* The list of argument string given to --plugin-opt. */
65 /* Number of args in the list, for convenience. */
67 /* The plugin's event handlers. */
68 ld_plugin_claim_file_handler claim_file_handler;
69 ld_plugin_all_symbols_read_handler all_symbols_read_handler;
70 ld_plugin_cleanup_handler cleanup_handler;
71 /* TRUE if the cleanup handlers have been called. */
72 bfd_boolean cleanup_done;
75 /* The master list of all plugins. */
76 static plugin_t *plugins_list = NULL;
78 /* We keep a tail pointer for easy linking on the end. */
79 static plugin_t **plugins_tail_chain_ptr = &plugins_list;
81 /* The last plugin added to the list, for receiving args. */
82 static plugin_t *last_plugin = NULL;
84 /* The tail of the arg chain of the last plugin added to the list. */
85 static plugin_arg_t **last_plugin_args_tail_chain_ptr = NULL;
87 /* The plugin which is currently having a callback executed. */
88 static plugin_t *called_plugin = NULL;
90 /* Last plugin to cause an error, if any. */
91 static const char *error_plugin = NULL;
93 /* A hash table that records symbols referenced by non-IR files. Used
94 at get_symbols time to determine whether any prevailing defs from
95 IR files are referenced only from other IR files, so tthat we can
96 we can distinguish the LDPR_PREVAILING_DEF and LDPR_PREVAILING_DEF_IRONLY
97 cases when establishing symbol resolutions. */
98 static struct bfd_hash_table *non_ironly_hash = NULL;
100 /* State of linker "notice" interface before we poked at it. */
101 static bfd_boolean orig_notice_all;
103 /* Original linker callbacks, and the plugin version. */
104 static const struct bfd_link_callbacks *orig_callbacks;
105 static struct bfd_link_callbacks plugin_callbacks;
107 /* Set at all symbols read time, to avoid recursively offering the plugin
108 its own newly-added input files and libs to claim. */
109 bfd_boolean no_more_claiming = FALSE;
111 /* List of tags to set in the constant leading part of the tv array. */
112 static const enum ld_plugin_tag tv_header_tags[] =
119 LDPT_REGISTER_CLAIM_FILE_HOOK,
120 LDPT_REGISTER_ALL_SYMBOLS_READ_HOOK,
121 LDPT_REGISTER_CLEANUP_HOOK,
124 LDPT_RELEASE_INPUT_FILE,
127 LDPT_ADD_INPUT_LIBRARY,
128 LDPT_SET_EXTRA_LIBRARY_PATH
131 /* How many entries in the constant leading part of the tv array. */
132 static const size_t tv_header_size = ARRAY_SIZE (tv_header_tags);
134 /* Forward references. */
135 static bfd_boolean plugin_notice (struct bfd_link_info *info,
136 const char *name, bfd *abfd,
137 asection *section, bfd_vma value);
138 static bfd_boolean plugin_multiple_definition (struct bfd_link_info *info,
139 struct bfd_link_hash_entry *h,
144 #if !defined (HAVE_DLFCN_H) && defined (HAVE_WINDOWS_H)
146 #define RTLD_NOW 0 /* Dummy value. */
149 dlopen (const char *file, int mode ATTRIBUTE_UNUSED)
151 return LoadLibrary (file);
155 dlsym (void *handle, const char *name)
157 return GetProcAddress (handle, name);
161 dlclose (void *handle)
163 FreeLibrary (handle);
167 #endif /* !defined (HAVE_DLFCN_H) && defined (HAVE_WINDOWS_H) */
169 /* Helper function for exiting with error status. */
171 set_plugin_error (const char *plugin)
173 error_plugin = plugin;
177 /* Test if an error occurred. */
179 plugin_error_p (void)
181 return error_plugin != NULL;
184 /* Return name of plugin which caused an error if any. */
186 plugin_error_plugin (void)
188 return error_plugin ? error_plugin : _("<no plugin>");
191 /* Handle -plugin arg: find and load plugin, or return error. */
193 plugin_opt_plugin (const char *plugin)
197 newplug = xmalloc (sizeof *newplug);
198 memset (newplug, 0, sizeof *newplug);
199 newplug->name = plugin;
200 newplug->dlhandle = dlopen (plugin, RTLD_NOW);
201 if (!newplug->dlhandle)
202 return set_plugin_error (plugin);
204 /* Chain on end, so when we run list it is in command-line order. */
205 *plugins_tail_chain_ptr = newplug;
206 plugins_tail_chain_ptr = &newplug->next;
208 /* Record it as current plugin for receiving args. */
209 last_plugin = newplug;
210 last_plugin_args_tail_chain_ptr = &newplug->args;
214 /* Accumulate option arguments for last-loaded plugin, or return
217 plugin_opt_plugin_arg (const char *arg)
219 plugin_arg_t *newarg;
222 return set_plugin_error (_("<no plugin>"));
224 newarg = xmalloc (sizeof *newarg);
228 /* Chain on end to preserve command-line order. */
229 *last_plugin_args_tail_chain_ptr = newarg;
230 last_plugin_args_tail_chain_ptr = &newarg->next;
231 last_plugin->n_args++;
235 /* Create a dummy BFD. */
237 plugin_get_ir_dummy_bfd (const char *name, bfd *srctemplate)
241 bfd_use_reserved_id = 1;
242 abfd = bfd_create (concat (name, IRONLY_SUFFIX, (const char *) NULL),
246 abfd->flags |= BFD_LINKER_CREATED | BFD_PLUGIN;
247 bfd_set_arch_info (abfd, bfd_get_arch_info (srctemplate));
248 bfd_set_gp_size (abfd, bfd_get_gp_size (srctemplate));
249 if (bfd_make_writable (abfd)
250 && bfd_copy_private_bfd_data (srctemplate, abfd))
254 /* Create sections to own the symbols. */
255 flags = (SEC_CODE | SEC_HAS_CONTENTS | SEC_READONLY
256 | SEC_ALLOC | SEC_LOAD | SEC_KEEP | SEC_EXCLUDE);
257 if (bfd_make_section_anyway_with_flags (abfd, ".text", flags))
261 einfo (_("could not create dummy IR bfd: %F%E\n"));
265 /* Check if the BFD passed in is an IR dummy object file. */
267 is_ir_dummy_bfd (const bfd *abfd)
269 /* ABFD can sometimes legitimately be NULL, e.g. when called from one
270 of the linker callbacks for a symbol in the *ABS* or *UND* sections.
271 Likewise, the usrdata field may be NULL if ABFD was added by the
272 backend without a corresponding input statement, as happens e.g.
273 when processing DT_NEEDED dependencies. */
276 && ((lang_input_statement_type *)(abfd->usrdata))->claimed);
279 /* Helpers to convert between BFD and GOLD symbol formats. */
280 static enum ld_plugin_status
281 asymbol_from_plugin_symbol (bfd *abfd, asymbol *asym,
282 const struct ld_plugin_symbol *ldsym)
284 flagword flags = BSF_NO_FLAGS;
285 struct bfd_section *section;
287 asym->the_bfd = abfd;
288 asym->name = (ldsym->version
289 ? concat (ldsym->name, "@", ldsym->version, (const char *) NULL)
299 section = bfd_get_section_by_name (abfd, ".text");
306 section = bfd_und_section_ptr;
311 section = bfd_com_section_ptr;
312 asym->value = ldsym->size;
313 /* For ELF targets, set alignment of common symbol to 1. */
314 if (bfd_get_flavour (abfd) == bfd_target_elf_flavour)
315 ((elf_symbol_type *) asym)->internal_elf_sym.st_value = 1;
322 asym->section = section;
324 /* Visibility only applies on ELF targets. */
325 if (bfd_get_flavour (abfd) == bfd_target_elf_flavour)
327 elf_symbol_type *elfsym = elf_symbol_from (abfd, asym);
328 unsigned char visibility;
331 einfo (_("%P%F: %s: non-ELF symbol in ELF BFD!\n"), asym->name);
332 switch (ldsym->visibility)
335 einfo (_("%P%F: unknown ELF symbol visibility: %d!\n"),
338 visibility = STV_DEFAULT;
341 visibility = STV_PROTECTED;
344 visibility = STV_INTERNAL;
347 visibility = STV_HIDDEN;
350 elfsym->internal_elf_sym.st_other
351 = (visibility | (elfsym->internal_elf_sym.st_other
352 & ~ELF_ST_VISIBILITY (-1)));
358 /* Register a claim-file handler. */
359 static enum ld_plugin_status
360 register_claim_file (ld_plugin_claim_file_handler handler)
362 ASSERT (called_plugin);
363 called_plugin->claim_file_handler = handler;
367 /* Register an all-symbols-read handler. */
368 static enum ld_plugin_status
369 register_all_symbols_read (ld_plugin_all_symbols_read_handler handler)
371 ASSERT (called_plugin);
372 called_plugin->all_symbols_read_handler = handler;
376 /* Register a cleanup handler. */
377 static enum ld_plugin_status
378 register_cleanup (ld_plugin_cleanup_handler handler)
380 ASSERT (called_plugin);
381 called_plugin->cleanup_handler = handler;
385 /* Add symbols from a plugin-claimed input file. */
386 static enum ld_plugin_status
387 add_symbols (void *handle, int nsyms, const struct ld_plugin_symbol *syms)
392 ASSERT (called_plugin);
393 symptrs = xmalloc (nsyms * sizeof *symptrs);
394 for (n = 0; n < nsyms; n++)
396 enum ld_plugin_status rv;
397 asymbol *bfdsym = bfd_make_empty_symbol (abfd);
399 rv = asymbol_from_plugin_symbol (abfd, bfdsym, syms + n);
403 bfd_set_symtab (abfd, symptrs, nsyms);
407 /* Get the input file information with an open (possibly re-opened)
409 static enum ld_plugin_status
410 get_input_file (const void *handle, struct ld_plugin_input_file *file)
412 ASSERT (called_plugin);
418 /* Release the input file. */
419 static enum ld_plugin_status
420 release_input_file (const void *handle)
422 ASSERT (called_plugin);
427 /* Return TRUE if a defined symbol might be reachable from outside the
428 universe of claimed objects. */
429 static inline bfd_boolean
430 is_visible_from_outside (struct ld_plugin_symbol *lsym, asection *section,
431 struct bfd_link_hash_entry *blhe)
433 /* Section's owner may be NULL if it is the absolute
434 section, fortunately is_ir_dummy_bfd handles that. */
435 if (!is_ir_dummy_bfd (section->owner))
437 if (link_info.relocatable)
439 if (link_info.export_dynamic || link_info.shared)
441 /* Only ELF symbols really have visibility. */
442 if (bfd_get_flavour (link_info.output_bfd) == bfd_target_elf_flavour)
444 struct elf_link_hash_entry *el = (struct elf_link_hash_entry *)blhe;
445 int vis = ELF_ST_VISIBILITY (el->other);
446 return vis == STV_DEFAULT || vis == STV_PROTECTED;
448 /* On non-ELF targets, we can safely make inferences by considering
449 what visibility the plugin would have liked to apply when it first
450 sent us the symbol. During ELF symbol processing, visibility only
451 ever becomes more restrictive, not less, when symbols are merged,
452 so this is a conservative estimate; it may give false positives,
453 declaring something visible from outside when it in fact would
454 not have been, but this will only lead to missed optimisation
455 opportunities during LTRANS at worst; it will not give false
456 negatives, which can lead to the disastrous conclusion that the
457 related symbol is IRONLY. (See GCC PR46319 for an example.) */
458 return (lsym->visibility == LDPV_DEFAULT
459 || lsym->visibility == LDPV_PROTECTED);
464 /* Get the symbol resolution info for a plugin-claimed input file. */
465 static enum ld_plugin_status
466 get_symbols (const void *handle, int nsyms, struct ld_plugin_symbol *syms)
468 const bfd *abfd = handle;
470 ASSERT (called_plugin);
471 for (n = 0; n < nsyms; n++)
473 struct bfd_link_hash_entry *blhe;
476 if (syms[n].def != LDPK_UNDEF)
477 blhe = bfd_link_hash_lookup (link_info.hash, syms[n].name,
480 blhe = bfd_wrapped_link_hash_lookup (link_info.output_bfd, &link_info,
481 syms[n].name, FALSE, FALSE, TRUE);
484 syms[n].resolution = LDPR_UNKNOWN;
488 /* Determine resolution from blhe type and symbol's original type. */
489 if (blhe->type == bfd_link_hash_undefined
490 || blhe->type == bfd_link_hash_undefweak)
492 syms[n].resolution = LDPR_UNDEF;
495 if (blhe->type != bfd_link_hash_defined
496 && blhe->type != bfd_link_hash_defweak
497 && blhe->type != bfd_link_hash_common)
499 /* We should not have a new, indirect or warning symbol here. */
500 einfo ("%P%F: %s: plugin symbol table corrupt (sym type %d)\n",
501 called_plugin->name, blhe->type);
504 /* Find out which section owns the symbol. Since it's not undef,
505 it must have an owner; if it's not a common symbol, both defs
506 and weakdefs keep it in the same place. */
507 owner_sec = (blhe->type == bfd_link_hash_common
508 ? blhe->u.c.p->section
509 : blhe->u.def.section);
511 /* We need to know if the sym is referenced from non-IR files. Or
512 even potentially-referenced, perhaps in a future final link if
513 this is a partial one, perhaps dynamically at load-time if the
514 symbol is externally visible. */
515 ironly = (!is_visible_from_outside (&syms[n], owner_sec, blhe)
516 && !bfd_hash_lookup (non_ironly_hash, syms[n].name,
519 /* If it was originally undefined or common, then it has been
520 resolved; determine how. */
521 if (syms[n].def == LDPK_UNDEF
522 || syms[n].def == LDPK_WEAKUNDEF
523 || syms[n].def == LDPK_COMMON)
525 if (owner_sec->owner == link_info.output_bfd)
526 syms[n].resolution = LDPR_RESOLVED_EXEC;
527 else if (owner_sec->owner == abfd)
528 syms[n].resolution = (ironly
529 ? LDPR_PREVAILING_DEF_IRONLY
530 : LDPR_PREVAILING_DEF);
531 else if (is_ir_dummy_bfd (owner_sec->owner))
532 syms[n].resolution = LDPR_RESOLVED_IR;
533 else if (owner_sec->owner != NULL
534 && (owner_sec->owner->flags & DYNAMIC) != 0)
535 syms[n].resolution = LDPR_RESOLVED_DYN;
537 syms[n].resolution = LDPR_RESOLVED_EXEC;
541 /* Was originally def, or weakdef. Does it prevail? If the
542 owner is the original dummy bfd that supplied it, then this
543 is the definition that has prevailed. */
544 if (owner_sec->owner == link_info.output_bfd)
545 syms[n].resolution = LDPR_PREEMPTED_REG;
546 else if (owner_sec->owner == abfd)
548 syms[n].resolution = (ironly
549 ? LDPR_PREVAILING_DEF_IRONLY
550 : LDPR_PREVAILING_DEF);
554 /* Was originally def, weakdef, or common, but has been pre-empted. */
555 syms[n].resolution = (is_ir_dummy_bfd (owner_sec->owner)
557 : LDPR_PREEMPTED_REG);
560 if (report_plugin_symbols)
561 einfo (_("%P: %B: symbol `%s' "
562 "definition: %d, visibility: %d, resolution: %d\n"),
564 syms[n].def, syms[n].visibility, syms[n].resolution);
569 /* Add a new (real) input file generated by a plugin. */
570 static enum ld_plugin_status
571 add_input_file (const char *pathname)
573 ASSERT (called_plugin);
574 if (!lang_add_input_file (xstrdup (pathname), lang_input_file_is_file_enum,
580 /* Add a new (real) library required by a plugin. */
581 static enum ld_plugin_status
582 add_input_library (const char *pathname)
584 ASSERT (called_plugin);
585 if (!lang_add_input_file (xstrdup (pathname), lang_input_file_is_l_enum,
591 /* Set the extra library path to be used by libraries added via
592 add_input_library. */
593 static enum ld_plugin_status
594 set_extra_library_path (const char *path)
596 ASSERT (called_plugin);
597 ldfile_add_library_path (xstrdup (path), FALSE);
601 /* Issue a diagnostic message from a plugin. */
602 static enum ld_plugin_status
603 message (int level, const char *format, ...)
606 va_start (args, format);
611 vfinfo (stdout, format, args, FALSE);
615 vfinfo (stdout, format, args, TRUE);
622 char *newfmt = ACONCAT ((level == LDPL_FATAL ? "%P%F: " : "%P%X: ",
623 format, "\n", (const char *) NULL));
625 vfinfo (stderr, newfmt, args, TRUE);
635 /* Helper to size leading part of tv array and set it up. */
637 set_tv_header (struct ld_plugin_tv *tv)
642 static const unsigned int major = (unsigned)(BFD_VERSION / 100000000UL);
643 static const unsigned int minor = (unsigned)(BFD_VERSION / 1000000UL) % 100;
646 return tv_header_size;
648 for (i = 0; i < tv_header_size; i++)
650 tv[i].tv_tag = tv_header_tags[i];
651 #define TVU(x) tv[i].tv_u.tv_ ## x
652 switch (tv[i].tv_tag)
655 TVU(message) = message;
657 case LDPT_API_VERSION:
658 TVU(val) = LD_PLUGIN_API_VERSION;
660 case LDPT_GNU_LD_VERSION:
661 TVU(val) = major * 100 + minor;
663 case LDPT_LINKER_OUTPUT:
664 TVU(val) = (link_info.relocatable
666 : (link_info.shared ? LDPO_DYN : LDPO_EXEC));
668 case LDPT_OUTPUT_NAME:
669 TVU(string) = output_filename;
671 case LDPT_REGISTER_CLAIM_FILE_HOOK:
672 TVU(register_claim_file) = register_claim_file;
674 case LDPT_REGISTER_ALL_SYMBOLS_READ_HOOK:
675 TVU(register_all_symbols_read) = register_all_symbols_read;
677 case LDPT_REGISTER_CLEANUP_HOOK:
678 TVU(register_cleanup) = register_cleanup;
680 case LDPT_ADD_SYMBOLS:
681 TVU(add_symbols) = add_symbols;
683 case LDPT_GET_INPUT_FILE:
684 TVU(get_input_file) = get_input_file;
686 case LDPT_RELEASE_INPUT_FILE:
687 TVU(release_input_file) = release_input_file;
689 case LDPT_GET_SYMBOLS:
690 TVU(get_symbols) = get_symbols;
692 case LDPT_ADD_INPUT_FILE:
693 TVU(add_input_file) = add_input_file;
695 case LDPT_ADD_INPUT_LIBRARY:
696 TVU(add_input_library) = add_input_library;
698 case LDPT_SET_EXTRA_LIBRARY_PATH:
699 TVU(set_extra_library_path) = set_extra_library_path;
702 /* Added a new entry to the array without adding
703 a new case to set up its value is a bug. */
708 return tv_header_size;
711 /* Append the per-plugin args list and trailing LDPT_NULL to tv. */
713 set_tv_plugin_args (plugin_t *plugin, struct ld_plugin_tv *tv)
715 plugin_arg_t *arg = plugin->args;
718 tv->tv_tag = LDPT_OPTION;
719 tv->tv_u.tv_string = arg->arg;
723 tv->tv_tag = LDPT_NULL;
727 /* Return true if any plugins are active this run. Only valid
728 after options have been processed. */
730 plugin_active_plugins_p (void)
732 return plugins_list != NULL;
735 /* Init the non_ironly hash table. */
737 init_non_ironly_hash (void)
739 struct bfd_sym_chain *sym;
742 = (struct bfd_hash_table *) xmalloc (sizeof (struct bfd_hash_table));
743 if (!bfd_hash_table_init_n (non_ironly_hash,
745 sizeof (struct bfd_hash_entry),
747 einfo (_("%P%F: bfd_hash_table_init failed: %E\n"));
749 for (sym = &entry_symbol; sym != NULL; sym = sym->next)
751 && !bfd_hash_lookup (non_ironly_hash, sym->name, TRUE, TRUE))
752 einfo (_("%P%X: hash table failure adding symbol %s\n"),
756 /* Load up and initialise all plugins after argument parsing. */
758 plugin_load_plugins (void)
760 struct ld_plugin_tv *my_tv;
761 unsigned int max_args = 0;
762 plugin_t *curplug = plugins_list;
764 /* If there are no plugins, we need do nothing this run. */
768 /* First pass over plugins to find max # args needed so that we
769 can size and allocate the tv array. */
772 if (curplug->n_args > max_args)
773 max_args = curplug->n_args;
774 curplug = curplug->next;
777 /* Allocate tv array and initialise constant part. */
778 my_tv = xmalloc ((max_args + 1 + tv_header_size) * sizeof *my_tv);
779 set_tv_header (my_tv);
781 /* Pass over plugins again, activating them. */
782 curplug = plugins_list;
785 enum ld_plugin_status rv;
786 ld_plugin_onload onloadfn = dlsym (curplug->dlhandle, "onload");
788 onloadfn = dlsym (curplug->dlhandle, "_onload");
790 return set_plugin_error (curplug->name);
791 set_tv_plugin_args (curplug, &my_tv[tv_header_size]);
792 called_plugin = curplug;
793 rv = (*onloadfn) (my_tv);
794 called_plugin = NULL;
796 return set_plugin_error (curplug->name);
797 curplug = curplug->next;
800 /* Since plugin(s) inited ok, assume they're going to want symbol
801 resolutions, which needs us to track which symbols are referenced
802 by non-IR files using the linker's notice callback. */
803 orig_notice_all = link_info.notice_all;
804 orig_callbacks = link_info.callbacks;
805 plugin_callbacks = *orig_callbacks;
806 plugin_callbacks.notice = &plugin_notice;
807 link_info.notice_all = TRUE;
808 link_info.callbacks = &plugin_callbacks;
809 init_non_ironly_hash ();
814 /* Call 'claim file' hook for all plugins. */
816 plugin_call_claim_file (const struct ld_plugin_input_file *file, int *claimed)
818 plugin_t *curplug = plugins_list;
820 if (no_more_claiming)
822 while (curplug && !*claimed)
824 if (curplug->claim_file_handler)
826 enum ld_plugin_status rv;
827 called_plugin = curplug;
828 rv = (*curplug->claim_file_handler) (file, claimed);
829 called_plugin = NULL;
831 set_plugin_error (curplug->name);
833 curplug = curplug->next;
835 return plugin_error_p () ? -1 : 0;
838 /* Call 'all symbols read' hook for all plugins. */
840 plugin_call_all_symbols_read (void)
842 plugin_t *curplug = plugins_list;
844 /* Disable any further file-claiming. */
845 no_more_claiming = TRUE;
847 plugin_callbacks.multiple_definition = &plugin_multiple_definition;
851 if (curplug->all_symbols_read_handler)
853 enum ld_plugin_status rv;
854 called_plugin = curplug;
855 rv = (*curplug->all_symbols_read_handler) ();
856 called_plugin = NULL;
858 set_plugin_error (curplug->name);
860 curplug = curplug->next;
862 return plugin_error_p () ? -1 : 0;
865 /* Call 'cleanup' hook for all plugins at exit. */
867 plugin_call_cleanup (void)
869 plugin_t *curplug = plugins_list;
872 if (curplug->cleanup_handler && !curplug->cleanup_done)
874 enum ld_plugin_status rv;
875 curplug->cleanup_done = TRUE;
876 called_plugin = curplug;
877 rv = (*curplug->cleanup_handler) ();
878 called_plugin = NULL;
880 set_plugin_error (curplug->name);
881 dlclose (curplug->dlhandle);
883 curplug = curplug->next;
885 if (plugin_error_p ())
886 info_msg (_("%P: %s: error in plugin cleanup (ignored)\n"),
887 plugin_error_plugin ());
890 /* To determine which symbols should be resolved LDPR_PREVAILING_DEF
891 and which LDPR_PREVAILING_DEF_IRONLY, we notice all the symbols as
892 the linker adds them to the linker hash table. If we see a symbol
893 being referenced from a non-IR file, we add it to the non_ironly hash
894 table. If we can't find it there at get_symbols time, we know that
895 it was referenced only by IR files. We have to notice_all symbols,
896 because we won't necessarily know until later which ones will be
897 contributed by IR files. */
899 plugin_notice (struct bfd_link_info *info,
907 /* No further processing if this def/ref is from an IR dummy BFD. */
908 if (is_ir_dummy_bfd (abfd))
911 /* We only care about refs, not defs, indicated by section
912 pointing to the undefined section (according to the bfd
913 linker notice callback interface definition). */
914 if (bfd_is_und_section (section))
916 /* This is a ref from a non-IR file, so note the ref'd
917 symbol in the non-IR-only hash. */
918 if (!bfd_hash_lookup (non_ironly_hash, name, TRUE, TRUE))
919 einfo (_("%P%X: %s: hash table failure adding symbol %s\n"),
920 abfd->filename, name);
924 /* Continue with cref/nocrossref/trace-sym processing. */
927 || (info->notice_hash != NULL
928 && bfd_hash_lookup (info->notice_hash, name, FALSE, FALSE) != NULL))
929 return (*orig_callbacks->notice) (info, name, abfd, section, value);
933 /* When we add new object files to the link at all symbols read time,
934 these contain the real code and symbols generated from the IR files,
935 and so duplicate all the definitions already supplied by the dummy
936 IR-only BFDs that we created at claim files time. We use the linker's
937 multiple-definitions callback hook to fix up the clash, discarding
938 the symbol from the IR-only BFD in favour of the symbol from the
939 real BFD. We return true if this was not-really-a-clash because
940 we've fixed it up, or anyway if --allow-multiple-definition was in
941 effect (before we disabled it to ensure we got called back). */
943 plugin_multiple_definition (struct bfd_link_info *info,
944 struct bfd_link_hash_entry *h,
945 bfd *nbfd, asection *nsec, bfd_vma nval)
947 if (h->type == bfd_link_hash_defined
948 && is_ir_dummy_bfd (h->u.def.section->owner))
950 /* Replace it with new details. */
951 h->u.def.section = nsec;
952 h->u.def.value = nval;
956 return (*orig_callbacks->multiple_definition) (info, h, nbfd, nsec, nval);