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" and "multiple_definition" interfaces
101 before we poked at them. */
102 static bfd_boolean orig_notice_all
;
103 static bfd_boolean orig_allow_multiple_defs
;
105 /* Original linker callbacks, and the plugin version. */
106 static const struct bfd_link_callbacks
*orig_callbacks
;
107 static struct bfd_link_callbacks plugin_callbacks
;
109 /* Set at all symbols read time, to avoid recursively offering the plugin
110 its own newly-added input files and libs to claim. */
111 bfd_boolean no_more_claiming
= FALSE
;
113 /* List of tags to set in the constant leading part of the tv array. */
114 static const enum ld_plugin_tag tv_header_tags
[] =
121 LDPT_REGISTER_CLAIM_FILE_HOOK
,
122 LDPT_REGISTER_ALL_SYMBOLS_READ_HOOK
,
123 LDPT_REGISTER_CLEANUP_HOOK
,
126 LDPT_RELEASE_INPUT_FILE
,
129 LDPT_ADD_INPUT_LIBRARY
,
130 LDPT_SET_EXTRA_LIBRARY_PATH
133 /* How many entries in the constant leading part of the tv array. */
134 static const size_t tv_header_size
= ARRAY_SIZE (tv_header_tags
);
136 /* Forward references. */
137 static bfd_boolean
plugin_notice (struct bfd_link_info
*info
,
138 const char *name
, bfd
*abfd
,
139 asection
*section
, bfd_vma value
);
140 static bfd_boolean
plugin_multiple_definition (struct bfd_link_info
*info
,
142 bfd
*obfd
, asection
*osec
,
143 bfd_vma oval
, bfd
*nbfd
,
147 #if !defined (HAVE_DLFCN_H) && defined (HAVE_WINDOWS_H)
149 #define RTLD_NOW 0 /* Dummy value. */
152 dlopen (const char *file
, int mode ATTRIBUTE_UNUSED
)
154 return LoadLibrary (file
);
158 dlsym (void *handle
, const char *name
)
160 return GetProcAddress (handle
, name
);
164 dlclose (void *handle
)
166 FreeLibrary (handle
);
170 #endif /* !defined (HAVE_DLFCN_H) && defined (HAVE_WINDOWS_H) */
172 /* Helper function for exiting with error status. */
174 set_plugin_error (const char *plugin
)
176 error_plugin
= plugin
;
180 /* Test if an error occurred. */
182 plugin_error_p (void)
184 return error_plugin
!= NULL
;
187 /* Return name of plugin which caused an error if any. */
189 plugin_error_plugin (void)
191 return error_plugin
? error_plugin
: _("<no plugin>");
194 /* Handle -plugin arg: find and load plugin, or return error. */
196 plugin_opt_plugin (const char *plugin
)
200 newplug
= xmalloc (sizeof *newplug
);
201 memset (newplug
, 0, sizeof *newplug
);
202 newplug
->name
= plugin
;
203 newplug
->dlhandle
= dlopen (plugin
, RTLD_NOW
);
204 if (!newplug
->dlhandle
)
205 return set_plugin_error (plugin
);
207 /* Chain on end, so when we run list it is in command-line order. */
208 *plugins_tail_chain_ptr
= newplug
;
209 plugins_tail_chain_ptr
= &newplug
->next
;
211 /* Record it as current plugin for receiving args. */
212 last_plugin
= newplug
;
213 last_plugin_args_tail_chain_ptr
= &newplug
->args
;
217 /* Accumulate option arguments for last-loaded plugin, or return
220 plugin_opt_plugin_arg (const char *arg
)
222 plugin_arg_t
*newarg
;
225 return set_plugin_error (_("<no plugin>"));
227 newarg
= xmalloc (sizeof *newarg
);
231 /* Chain on end to preserve command-line order. */
232 *last_plugin_args_tail_chain_ptr
= newarg
;
233 last_plugin_args_tail_chain_ptr
= &newarg
->next
;
234 last_plugin
->n_args
++;
238 /* Create a dummy BFD. */
240 plugin_get_ir_dummy_bfd (const char *name
, bfd
*srctemplate
)
244 bfd_use_reserved_id
= 1;
245 abfd
= bfd_create (concat (name
, IRONLY_SUFFIX
, (const char *) NULL
),
249 abfd
->flags
|= BFD_LINKER_CREATED
| BFD_PLUGIN
;
250 bfd_set_arch_info (abfd
, bfd_get_arch_info (srctemplate
));
251 bfd_set_gp_size (abfd
, bfd_get_gp_size (srctemplate
));
252 if (bfd_make_writable (abfd
)
253 && bfd_copy_private_bfd_data (srctemplate
, abfd
))
257 /* Create sections to own the symbols. */
258 flags
= (SEC_CODE
| SEC_HAS_CONTENTS
| SEC_READONLY
259 | SEC_ALLOC
| SEC_LOAD
| SEC_KEEP
| SEC_EXCLUDE
);
260 if (bfd_make_section_anyway_with_flags (abfd
, ".text", flags
))
264 einfo (_("could not create dummy IR bfd: %F%E\n"));
268 /* Check if the BFD passed in is an IR dummy object file. */
270 is_ir_dummy_bfd (const bfd
*abfd
)
272 /* ABFD can sometimes legitimately be NULL, e.g. when called from one
273 of the linker callbacks for a symbol in the *ABS* or *UND* sections.
274 Likewise, the usrdata field may be NULL if ABFD was added by the
275 backend without a corresponding input statement, as happens e.g.
276 when processing DT_NEEDED dependencies. */
279 && ((lang_input_statement_type
*)(abfd
->usrdata
))->claimed
);
282 /* Helpers to convert between BFD and GOLD symbol formats. */
283 static enum ld_plugin_status
284 asymbol_from_plugin_symbol (bfd
*abfd
, asymbol
*asym
,
285 const struct ld_plugin_symbol
*ldsym
)
287 flagword flags
= BSF_NO_FLAGS
;
288 struct bfd_section
*section
;
290 asym
->the_bfd
= abfd
;
291 asym
->name
= (ldsym
->version
292 ? concat (ldsym
->name
, "@", ldsym
->version
, (const char *) NULL
)
302 section
= bfd_get_section_by_name (abfd
, ".text");
309 section
= bfd_und_section_ptr
;
314 section
= bfd_com_section_ptr
;
315 asym
->value
= ldsym
->size
;
316 /* For ELF targets, set alignment of common symbol to 1. */
317 if (bfd_get_flavour (abfd
) == bfd_target_elf_flavour
)
318 ((elf_symbol_type
*) asym
)->internal_elf_sym
.st_value
= 1;
325 asym
->section
= section
;
327 /* Visibility only applies on ELF targets. */
328 if (bfd_get_flavour (abfd
) == bfd_target_elf_flavour
)
330 elf_symbol_type
*elfsym
= elf_symbol_from (abfd
, asym
);
331 unsigned char visibility
;
334 einfo (_("%P%F: %s: non-ELF symbol in ELF BFD!\n"), asym
->name
);
335 switch (ldsym
->visibility
)
338 einfo (_("%P%F: unknown ELF symbol visibility: %d!\n"),
341 visibility
= STV_DEFAULT
;
344 visibility
= STV_PROTECTED
;
347 visibility
= STV_INTERNAL
;
350 visibility
= STV_HIDDEN
;
353 elfsym
->internal_elf_sym
.st_other
354 = (visibility
| (elfsym
->internal_elf_sym
.st_other
355 & ~ELF_ST_VISIBILITY (-1)));
361 /* Register a claim-file handler. */
362 static enum ld_plugin_status
363 register_claim_file (ld_plugin_claim_file_handler handler
)
365 ASSERT (called_plugin
);
366 called_plugin
->claim_file_handler
= handler
;
370 /* Register an all-symbols-read handler. */
371 static enum ld_plugin_status
372 register_all_symbols_read (ld_plugin_all_symbols_read_handler handler
)
374 ASSERT (called_plugin
);
375 called_plugin
->all_symbols_read_handler
= handler
;
379 /* Register a cleanup handler. */
380 static enum ld_plugin_status
381 register_cleanup (ld_plugin_cleanup_handler handler
)
383 ASSERT (called_plugin
);
384 called_plugin
->cleanup_handler
= handler
;
388 /* Add symbols from a plugin-claimed input file. */
389 static enum ld_plugin_status
390 add_symbols (void *handle
, int nsyms
, const struct ld_plugin_symbol
*syms
)
395 ASSERT (called_plugin
);
396 symptrs
= xmalloc (nsyms
* sizeof *symptrs
);
397 for (n
= 0; n
< nsyms
; n
++)
399 enum ld_plugin_status rv
;
400 asymbol
*bfdsym
= bfd_make_empty_symbol (abfd
);
402 rv
= asymbol_from_plugin_symbol (abfd
, bfdsym
, syms
+ n
);
406 bfd_set_symtab (abfd
, symptrs
, nsyms
);
410 /* Get the input file information with an open (possibly re-opened)
412 static enum ld_plugin_status
413 get_input_file (const void *handle
, struct ld_plugin_input_file
*file
)
415 ASSERT (called_plugin
);
421 /* Release the input file. */
422 static enum ld_plugin_status
423 release_input_file (const void *handle
)
425 ASSERT (called_plugin
);
430 /* Return TRUE if a defined symbol might be reachable from outside the
431 universe of claimed objects. */
432 static inline bfd_boolean
433 is_visible_from_outside (struct ld_plugin_symbol
*lsym
, asection
*section
,
434 struct bfd_link_hash_entry
*blhe
)
436 /* Section's owner may be NULL if it is the absolute
437 section, fortunately is_ir_dummy_bfd handles that. */
438 if (!is_ir_dummy_bfd (section
->owner
))
440 if (link_info
.relocatable
)
442 if (link_info
.export_dynamic
|| link_info
.shared
)
444 /* Only ELF symbols really have visibility. */
445 if (bfd_get_flavour (link_info
.output_bfd
) == bfd_target_elf_flavour
)
447 struct elf_link_hash_entry
*el
= (struct elf_link_hash_entry
*)blhe
;
448 int vis
= ELF_ST_VISIBILITY (el
->other
);
449 return vis
== STV_DEFAULT
|| vis
== STV_PROTECTED
;
451 /* On non-ELF targets, we can safely make inferences by considering
452 what visibility the plugin would have liked to apply when it first
453 sent us the symbol. During ELF symbol processing, visibility only
454 ever becomes more restrictive, not less, when symbols are merged,
455 so this is a conservative estimate; it may give false positives,
456 declaring something visible from outside when it in fact would
457 not have been, but this will only lead to missed optimisation
458 opportunities during LTRANS at worst; it will not give false
459 negatives, which can lead to the disastrous conclusion that the
460 related symbol is IRONLY. (See GCC PR46319 for an example.) */
461 return (lsym
->visibility
== LDPV_DEFAULT
462 || lsym
->visibility
== LDPV_PROTECTED
);
467 /* Get the symbol resolution info for a plugin-claimed input file. */
468 static enum ld_plugin_status
469 get_symbols (const void *handle
, int nsyms
, struct ld_plugin_symbol
*syms
)
471 const bfd
*abfd
= handle
;
473 ASSERT (called_plugin
);
474 for (n
= 0; n
< nsyms
; n
++)
476 struct bfd_link_hash_entry
*blhe
;
479 if (syms
[n
].def
!= LDPK_UNDEF
)
480 blhe
= bfd_link_hash_lookup (link_info
.hash
, syms
[n
].name
,
483 blhe
= bfd_wrapped_link_hash_lookup (link_info
.output_bfd
, &link_info
,
484 syms
[n
].name
, FALSE
, FALSE
, TRUE
);
487 syms
[n
].resolution
= LDPR_UNKNOWN
;
491 /* Determine resolution from blhe type and symbol's original type. */
492 if (blhe
->type
== bfd_link_hash_undefined
493 || blhe
->type
== bfd_link_hash_undefweak
)
495 syms
[n
].resolution
= LDPR_UNDEF
;
498 if (blhe
->type
!= bfd_link_hash_defined
499 && blhe
->type
!= bfd_link_hash_defweak
500 && blhe
->type
!= bfd_link_hash_common
)
502 /* We should not have a new, indirect or warning symbol here. */
503 einfo ("%P%F: %s: plugin symbol table corrupt (sym type %d)\n",
504 called_plugin
->name
, blhe
->type
);
507 /* Find out which section owns the symbol. Since it's not undef,
508 it must have an owner; if it's not a common symbol, both defs
509 and weakdefs keep it in the same place. */
510 owner_sec
= (blhe
->type
== bfd_link_hash_common
511 ? blhe
->u
.c
.p
->section
512 : blhe
->u
.def
.section
);
514 /* We need to know if the sym is referenced from non-IR files. Or
515 even potentially-referenced, perhaps in a future final link if
516 this is a partial one, perhaps dynamically at load-time if the
517 symbol is externally visible. */
518 ironly
= (!is_visible_from_outside (&syms
[n
], owner_sec
, blhe
)
519 && !bfd_hash_lookup (non_ironly_hash
, syms
[n
].name
,
522 /* If it was originally undefined or common, then it has been
523 resolved; determine how. */
524 if (syms
[n
].def
== LDPK_UNDEF
525 || syms
[n
].def
== LDPK_WEAKUNDEF
526 || syms
[n
].def
== LDPK_COMMON
)
528 if (owner_sec
->owner
== link_info
.output_bfd
)
529 syms
[n
].resolution
= LDPR_RESOLVED_EXEC
;
530 else if (owner_sec
->owner
== abfd
)
531 syms
[n
].resolution
= (ironly
532 ? LDPR_PREVAILING_DEF_IRONLY
533 : LDPR_PREVAILING_DEF
);
534 else if (is_ir_dummy_bfd (owner_sec
->owner
))
535 syms
[n
].resolution
= LDPR_RESOLVED_IR
;
536 else if (owner_sec
->owner
!= NULL
537 && (owner_sec
->owner
->flags
& DYNAMIC
) != 0)
538 syms
[n
].resolution
= LDPR_RESOLVED_DYN
;
540 syms
[n
].resolution
= LDPR_RESOLVED_EXEC
;
544 /* Was originally def, or weakdef. Does it prevail? If the
545 owner is the original dummy bfd that supplied it, then this
546 is the definition that has prevailed. */
547 if (owner_sec
->owner
== link_info
.output_bfd
)
548 syms
[n
].resolution
= LDPR_PREEMPTED_REG
;
549 else if (owner_sec
->owner
== abfd
)
551 syms
[n
].resolution
= (ironly
552 ? LDPR_PREVAILING_DEF_IRONLY
553 : LDPR_PREVAILING_DEF
);
557 /* Was originally def, weakdef, or common, but has been pre-empted. */
558 syms
[n
].resolution
= (is_ir_dummy_bfd (owner_sec
->owner
)
560 : LDPR_PREEMPTED_REG
);
563 if (report_plugin_symbols
)
564 einfo (_("%P: %B: symbol `%s' "
565 "definition: %d, visibility: %d, resolution: %d\n"),
567 syms
[n
].def
, syms
[n
].visibility
, syms
[n
].resolution
);
572 /* Add a new (real) input file generated by a plugin. */
573 static enum ld_plugin_status
574 add_input_file (const char *pathname
)
576 ASSERT (called_plugin
);
577 if (!lang_add_input_file (xstrdup (pathname
), lang_input_file_is_file_enum
,
583 /* Add a new (real) library required by a plugin. */
584 static enum ld_plugin_status
585 add_input_library (const char *pathname
)
587 ASSERT (called_plugin
);
588 if (!lang_add_input_file (xstrdup (pathname
), lang_input_file_is_l_enum
,
594 /* Set the extra library path to be used by libraries added via
595 add_input_library. */
596 static enum ld_plugin_status
597 set_extra_library_path (const char *path
)
599 ASSERT (called_plugin
);
600 ldfile_add_library_path (xstrdup (path
), FALSE
);
604 /* Issue a diagnostic message from a plugin. */
605 static enum ld_plugin_status
606 message (int level
, const char *format
, ...)
609 va_start (args
, format
);
614 vfinfo (stdout
, format
, args
, FALSE
);
618 vfinfo (stdout
, format
, args
, TRUE
);
625 char *newfmt
= ACONCAT ((level
== LDPL_FATAL
? "%P%F: " : "%P%X: ",
626 format
, "\n", (const char *) NULL
));
628 vfinfo (stderr
, newfmt
, args
, TRUE
);
638 /* Helper to size leading part of tv array and set it up. */
640 set_tv_header (struct ld_plugin_tv
*tv
)
645 static const unsigned int major
= (unsigned)(BFD_VERSION
/ 100000000UL);
646 static const unsigned int minor
= (unsigned)(BFD_VERSION
/ 1000000UL) % 100;
649 return tv_header_size
;
651 for (i
= 0; i
< tv_header_size
; i
++)
653 tv
[i
].tv_tag
= tv_header_tags
[i
];
654 #define TVU(x) tv[i].tv_u.tv_ ## x
655 switch (tv
[i
].tv_tag
)
658 TVU(message
) = message
;
660 case LDPT_API_VERSION
:
661 TVU(val
) = LD_PLUGIN_API_VERSION
;
663 case LDPT_GNU_LD_VERSION
:
664 TVU(val
) = major
* 100 + minor
;
666 case LDPT_LINKER_OUTPUT
:
667 TVU(val
) = (link_info
.relocatable
669 : (link_info
.shared
? LDPO_DYN
: LDPO_EXEC
));
671 case LDPT_OUTPUT_NAME
:
672 TVU(string
) = output_filename
;
674 case LDPT_REGISTER_CLAIM_FILE_HOOK
:
675 TVU(register_claim_file
) = register_claim_file
;
677 case LDPT_REGISTER_ALL_SYMBOLS_READ_HOOK
:
678 TVU(register_all_symbols_read
) = register_all_symbols_read
;
680 case LDPT_REGISTER_CLEANUP_HOOK
:
681 TVU(register_cleanup
) = register_cleanup
;
683 case LDPT_ADD_SYMBOLS
:
684 TVU(add_symbols
) = add_symbols
;
686 case LDPT_GET_INPUT_FILE
:
687 TVU(get_input_file
) = get_input_file
;
689 case LDPT_RELEASE_INPUT_FILE
:
690 TVU(release_input_file
) = release_input_file
;
692 case LDPT_GET_SYMBOLS
:
693 TVU(get_symbols
) = get_symbols
;
695 case LDPT_ADD_INPUT_FILE
:
696 TVU(add_input_file
) = add_input_file
;
698 case LDPT_ADD_INPUT_LIBRARY
:
699 TVU(add_input_library
) = add_input_library
;
701 case LDPT_SET_EXTRA_LIBRARY_PATH
:
702 TVU(set_extra_library_path
) = set_extra_library_path
;
705 /* Added a new entry to the array without adding
706 a new case to set up its value is a bug. */
711 return tv_header_size
;
714 /* Append the per-plugin args list and trailing LDPT_NULL to tv. */
716 set_tv_plugin_args (plugin_t
*plugin
, struct ld_plugin_tv
*tv
)
718 plugin_arg_t
*arg
= plugin
->args
;
721 tv
->tv_tag
= LDPT_OPTION
;
722 tv
->tv_u
.tv_string
= arg
->arg
;
726 tv
->tv_tag
= LDPT_NULL
;
730 /* Return true if any plugins are active this run. Only valid
731 after options have been processed. */
733 plugin_active_plugins_p (void)
735 return plugins_list
!= NULL
;
738 /* Init the non_ironly hash table. */
740 init_non_ironly_hash (void)
742 struct bfd_sym_chain
*sym
;
745 = (struct bfd_hash_table
*) xmalloc (sizeof (struct bfd_hash_table
));
746 if (!bfd_hash_table_init_n (non_ironly_hash
,
748 sizeof (struct bfd_hash_entry
),
750 einfo (_("%P%F: bfd_hash_table_init failed: %E\n"));
752 for (sym
= &entry_symbol
; sym
!= NULL
; sym
= sym
->next
)
754 && !bfd_hash_lookup (non_ironly_hash
, sym
->name
, TRUE
, TRUE
))
755 einfo (_("%P%X: hash table failure adding symbol %s\n"),
759 /* Load up and initialise all plugins after argument parsing. */
761 plugin_load_plugins (void)
763 struct ld_plugin_tv
*my_tv
;
764 unsigned int max_args
= 0;
765 plugin_t
*curplug
= plugins_list
;
767 /* If there are no plugins, we need do nothing this run. */
771 /* First pass over plugins to find max # args needed so that we
772 can size and allocate the tv array. */
775 if (curplug
->n_args
> max_args
)
776 max_args
= curplug
->n_args
;
777 curplug
= curplug
->next
;
780 /* Allocate tv array and initialise constant part. */
781 my_tv
= xmalloc ((max_args
+ 1 + tv_header_size
) * sizeof *my_tv
);
782 set_tv_header (my_tv
);
784 /* Pass over plugins again, activating them. */
785 curplug
= plugins_list
;
788 enum ld_plugin_status rv
;
789 ld_plugin_onload onloadfn
= dlsym (curplug
->dlhandle
, "onload");
791 onloadfn
= dlsym (curplug
->dlhandle
, "_onload");
793 return set_plugin_error (curplug
->name
);
794 set_tv_plugin_args (curplug
, &my_tv
[tv_header_size
]);
795 called_plugin
= curplug
;
796 rv
= (*onloadfn
) (my_tv
);
797 called_plugin
= NULL
;
799 return set_plugin_error (curplug
->name
);
800 curplug
= curplug
->next
;
803 /* Since plugin(s) inited ok, assume they're going to want symbol
804 resolutions, which needs us to track which symbols are referenced
805 by non-IR files using the linker's notice callback. */
806 orig_notice_all
= link_info
.notice_all
;
807 orig_callbacks
= link_info
.callbacks
;
808 plugin_callbacks
= *orig_callbacks
;
809 plugin_callbacks
.notice
= &plugin_notice
;
810 link_info
.notice_all
= TRUE
;
811 link_info
.callbacks
= &plugin_callbacks
;
812 init_non_ironly_hash ();
817 /* Call 'claim file' hook for all plugins. */
819 plugin_call_claim_file (const struct ld_plugin_input_file
*file
, int *claimed
)
821 plugin_t
*curplug
= plugins_list
;
823 if (no_more_claiming
)
825 while (curplug
&& !*claimed
)
827 if (curplug
->claim_file_handler
)
829 enum ld_plugin_status rv
;
830 called_plugin
= curplug
;
831 rv
= (*curplug
->claim_file_handler
) (file
, claimed
);
832 called_plugin
= NULL
;
834 set_plugin_error (curplug
->name
);
836 curplug
= curplug
->next
;
838 return plugin_error_p () ? -1 : 0;
841 /* Call 'all symbols read' hook for all plugins. */
843 plugin_call_all_symbols_read (void)
845 plugin_t
*curplug
= plugins_list
;
847 /* Disable any further file-claiming. */
848 no_more_claiming
= TRUE
;
850 /* If --allow-multiple-definition is in effect, we need to disable it,
851 as the plugin infrastructure relies on the multiple_definition
852 callback to swap out the dummy IR-only BFDs for new real ones
853 when it starts opening the files added during this callback. */
854 orig_allow_multiple_defs
= link_info
.allow_multiple_definition
;
855 link_info
.allow_multiple_definition
= FALSE
;
856 plugin_callbacks
.multiple_definition
= &plugin_multiple_definition
;
860 if (curplug
->all_symbols_read_handler
)
862 enum ld_plugin_status rv
;
863 called_plugin
= curplug
;
864 rv
= (*curplug
->all_symbols_read_handler
) ();
865 called_plugin
= NULL
;
867 set_plugin_error (curplug
->name
);
869 curplug
= curplug
->next
;
871 return plugin_error_p () ? -1 : 0;
874 /* Call 'cleanup' hook for all plugins at exit. */
876 plugin_call_cleanup (void)
878 plugin_t
*curplug
= plugins_list
;
881 if (curplug
->cleanup_handler
&& !curplug
->cleanup_done
)
883 enum ld_plugin_status rv
;
884 curplug
->cleanup_done
= TRUE
;
885 called_plugin
= curplug
;
886 rv
= (*curplug
->cleanup_handler
) ();
887 called_plugin
= NULL
;
889 set_plugin_error (curplug
->name
);
890 dlclose (curplug
->dlhandle
);
892 curplug
= curplug
->next
;
894 if (plugin_error_p ())
895 info_msg (_("%P: %s: error in plugin cleanup (ignored)\n"),
896 plugin_error_plugin ());
899 /* To determine which symbols should be resolved LDPR_PREVAILING_DEF
900 and which LDPR_PREVAILING_DEF_IRONLY, we notice all the symbols as
901 the linker adds them to the linker hash table. If we see a symbol
902 being referenced from a non-IR file, we add it to the non_ironly hash
903 table. If we can't find it there at get_symbols time, we know that
904 it was referenced only by IR files. We have to notice_all symbols,
905 because we won't necessarily know until later which ones will be
906 contributed by IR files. */
908 plugin_notice (struct bfd_link_info
*info
,
916 /* No further processing if this def/ref is from an IR dummy BFD. */
917 if (is_ir_dummy_bfd (abfd
))
920 /* We only care about refs, not defs, indicated by section
921 pointing to the undefined section (according to the bfd
922 linker notice callback interface definition). */
923 if (bfd_is_und_section (section
))
925 /* This is a ref from a non-IR file, so note the ref'd
926 symbol in the non-IR-only hash. */
927 if (!bfd_hash_lookup (non_ironly_hash
, name
, TRUE
, TRUE
))
928 einfo (_("%P%X: %s: hash table failure adding symbol %s\n"),
929 abfd
->filename
, name
);
933 /* Continue with cref/nocrossref/trace-sym processing. */
936 || (info
->notice_hash
!= NULL
937 && bfd_hash_lookup (info
->notice_hash
, name
, FALSE
, FALSE
) != NULL
))
938 return (*orig_callbacks
->notice
) (info
, name
, abfd
, section
, value
);
942 /* When we add new object files to the link at all symbols read time,
943 these contain the real code and symbols generated from the IR files,
944 and so duplicate all the definitions already supplied by the dummy
945 IR-only BFDs that we created at claim files time. We use the linker's
946 multiple-definitions callback hook to fix up the clash, discarding
947 the symbol from the IR-only BFD in favour of the symbol from the
948 real BFD. We return true if this was not-really-a-clash because
949 we've fixed it up, or anyway if --allow-multiple-definition was in
950 effect (before we disabled it to ensure we got called back). */
952 plugin_multiple_definition (struct bfd_link_info
*info
, const char *name
,
953 bfd
*obfd
, asection
*osec
, bfd_vma oval
,
954 bfd
*nbfd
, asection
*nsec
, bfd_vma nval
)
956 if (is_ir_dummy_bfd (obfd
))
958 struct bfd_link_hash_entry
*blhe
959 = bfd_link_hash_lookup (info
->hash
, name
, FALSE
, FALSE
, FALSE
);
961 einfo (_("%P%X: %s: can't find IR symbol '%s'\n"), nbfd
->filename
,
963 else if (blhe
->type
!= bfd_link_hash_defined
)
964 einfo (_("%P%x: %s: bad IR symbol type %d\n"), name
, blhe
->type
);
965 /* Replace it with new details. */
966 blhe
->u
.def
.section
= nsec
;
967 blhe
->u
.def
.value
= nval
;
971 if (orig_allow_multiple_defs
)
974 return (*orig_callbacks
->multiple_definition
) (info
, name
, obfd
, osec
, oval
,