1 /* Plugin control for the GNU linker.
2 Copyright (C) 2010-2019 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"
32 #include "plugin-api.h"
33 #include "../bfd/plugin.h"
37 # include <sys/mman.h>
39 # define MAP_FAILED ((void *) -1)
45 # define MAP_PRIVATE 0
49 #if !(defined(errno) || defined(_MSC_VER) && defined(_INC_ERRNO))
52 #if !defined (HAVE_DLFCN_H) && defined (HAVE_WINDOWS_H)
56 /* Report plugin symbols. */
57 bfd_boolean report_plugin_symbols
;
59 /* The suffix to append to the name of the real (claimed) object file
60 when generating a dummy BFD to hold the IR symbols sent from the
61 plugin. For cosmetic use only; appears in maps, crefs etc. */
62 #define IRONLY_SUFFIX " (symbol from plugin)"
64 /* Stores a single argument passed to a plugin. */
65 typedef struct plugin_arg
67 struct plugin_arg
*next
;
71 /* Holds all details of a single plugin. */
74 /* Next on the list of plugins, or NULL at end of chain. */
76 /* The argument string given to --plugin. */
78 /* The shared library handle returned by dlopen. */
80 /* The list of argument string given to --plugin-opt. */
82 /* Number of args in the list, for convenience. */
84 /* The plugin's event handlers. */
85 ld_plugin_claim_file_handler claim_file_handler
;
86 ld_plugin_all_symbols_read_handler all_symbols_read_handler
;
87 ld_plugin_cleanup_handler cleanup_handler
;
88 /* TRUE if the cleanup handlers have been called. */
89 bfd_boolean cleanup_done
;
92 typedef struct view_buffer
99 /* The internal version of struct ld_plugin_input_file with a BFD
101 typedef struct plugin_input_file
104 view_buffer_t view_buffer
;
107 bfd_boolean use_mmap
;
110 } plugin_input_file_t
;
112 /* The master list of all plugins. */
113 static plugin_t
*plugins_list
= NULL
;
115 /* We keep a tail pointer for easy linking on the end. */
116 static plugin_t
**plugins_tail_chain_ptr
= &plugins_list
;
118 /* The last plugin added to the list, for receiving args. */
119 static plugin_t
*last_plugin
= NULL
;
121 /* The tail of the arg chain of the last plugin added to the list. */
122 static plugin_arg_t
**last_plugin_args_tail_chain_ptr
= NULL
;
124 /* The plugin which is currently having a callback executed. */
125 static plugin_t
*called_plugin
= NULL
;
127 /* Last plugin to cause an error, if any. */
128 static const char *error_plugin
= NULL
;
130 /* State of linker "notice" interface before we poked at it. */
131 static bfd_boolean orig_notice_all
;
133 /* Original linker callbacks, and the plugin version. */
134 static const struct bfd_link_callbacks
*orig_callbacks
;
135 static struct bfd_link_callbacks plugin_callbacks
;
137 /* Set at all symbols read time, to avoid recursively offering the plugin
138 its own newly-added input files and libs to claim. */
139 bfd_boolean no_more_claiming
= FALSE
;
141 #if HAVE_MMAP && HAVE_GETPAGESIZE
142 /* Page size used by mmap. */
143 static off_t plugin_pagesize
;
146 /* List of tags to set in the constant leading part of the tv array. */
147 static const enum ld_plugin_tag tv_header_tags
[] =
154 LDPT_REGISTER_CLAIM_FILE_HOOK
,
155 LDPT_REGISTER_ALL_SYMBOLS_READ_HOOK
,
156 LDPT_REGISTER_CLEANUP_HOOK
,
160 LDPT_RELEASE_INPUT_FILE
,
164 LDPT_ADD_INPUT_LIBRARY
,
165 LDPT_SET_EXTRA_LIBRARY_PATH
168 /* How many entries in the constant leading part of the tv array. */
169 static const size_t tv_header_size
= ARRAY_SIZE (tv_header_tags
);
171 /* Forward references. */
172 static bfd_boolean
plugin_notice (struct bfd_link_info
*,
173 struct bfd_link_hash_entry
*,
174 struct bfd_link_hash_entry
*,
175 bfd
*, asection
*, bfd_vma
, flagword
);
177 static const bfd_target
* plugin_object_p (bfd
*);
179 #if !defined (HAVE_DLFCN_H) && defined (HAVE_WINDOWS_H)
181 #define RTLD_NOW 0 /* Dummy value. */
184 dlopen (const char *file
, int mode ATTRIBUTE_UNUSED
)
186 return LoadLibrary (file
);
190 dlsym (void *handle
, const char *name
)
192 return GetProcAddress (handle
, name
);
196 dlclose (void *handle
)
198 FreeLibrary (handle
);
202 #endif /* !defined (HAVE_DLFCN_H) && defined (HAVE_WINDOWS_H) */
212 /* Helper function for exiting with error status. */
214 set_plugin_error (const char *plugin
)
216 error_plugin
= plugin
;
220 /* Test if an error occurred. */
222 plugin_error_p (void)
224 return error_plugin
!= NULL
;
227 /* Return name of plugin which caused an error if any. */
229 plugin_error_plugin (void)
231 return error_plugin
? error_plugin
: _("<no plugin>");
234 /* Handle -plugin arg: find and load plugin, or return error. */
236 plugin_opt_plugin (const char *plugin
)
239 plugin_t
*curplug
= plugins_list
;
241 newplug
= xmalloc (sizeof *newplug
);
242 memset (newplug
, 0, sizeof *newplug
);
243 newplug
->name
= plugin
;
244 newplug
->dlhandle
= dlopen (plugin
, RTLD_NOW
);
245 if (!newplug
->dlhandle
)
246 einfo (_("%F%P: %s: error loading plugin: %s\n"), plugin
, dlerror ());
248 /* Check if plugin has been loaded already. */
251 if (newplug
->dlhandle
== curplug
->dlhandle
)
253 einfo (_("%P: %s: duplicated plugin\n"), plugin
);
257 curplug
= curplug
->next
;
260 /* Chain on end, so when we run list it is in command-line order. */
261 *plugins_tail_chain_ptr
= newplug
;
262 plugins_tail_chain_ptr
= &newplug
->next
;
264 /* Record it as current plugin for receiving args. */
265 last_plugin
= newplug
;
266 last_plugin_args_tail_chain_ptr
= &newplug
->args
;
269 /* Accumulate option arguments for last-loaded plugin, or return
272 plugin_opt_plugin_arg (const char *arg
)
274 plugin_arg_t
*newarg
;
277 return set_plugin_error (_("<no plugin>"));
279 /* Ignore -pass-through= from GCC driver. */
282 const char *p
= arg
+ 1;
286 if (strncmp (p
, "pass-through=", 13) == 0)
290 newarg
= xmalloc (sizeof *newarg
);
294 /* Chain on end to preserve command-line order. */
295 *last_plugin_args_tail_chain_ptr
= newarg
;
296 last_plugin_args_tail_chain_ptr
= &newarg
->next
;
297 last_plugin
->n_args
++;
301 /* Generate a dummy BFD to represent an IR file, for any callers of
302 plugin_call_claim_file to use as the handle in the ld_plugin_input_file
303 struct that they build to pass in. The BFD is initially writable, so
304 that symbols can be added to it; it must be made readable after the
305 add_symbols hook has been called so that it can be read when linking. */
307 plugin_get_ir_dummy_bfd (const char *name
, bfd
*srctemplate
)
310 bfd_boolean bfd_plugin_target
;
312 bfd_use_reserved_id
= 1;
313 bfd_plugin_target
= bfd_plugin_target_p (srctemplate
->xvec
);
314 abfd
= bfd_create (concat (name
, IRONLY_SUFFIX
, (const char *) NULL
),
315 bfd_plugin_target
? link_info
.output_bfd
: srctemplate
);
318 abfd
->flags
|= BFD_LINKER_CREATED
| BFD_PLUGIN
;
319 if (!bfd_make_writable (abfd
))
321 if (!bfd_plugin_target
)
323 bfd_set_arch_info (abfd
, bfd_get_arch_info (srctemplate
));
324 bfd_set_gp_size (abfd
, bfd_get_gp_size (srctemplate
));
325 if (!bfd_copy_private_bfd_data (srctemplate
, abfd
))
331 /* Create section to own the symbols. */
332 flags
= (SEC_CODE
| SEC_HAS_CONTENTS
| SEC_READONLY
333 | SEC_ALLOC
| SEC_LOAD
| SEC_KEEP
| SEC_EXCLUDE
);
334 if (bfd_make_section_anyway_with_flags (abfd
, ".text", flags
))
339 einfo (_("%F%P: could not create dummy IR bfd: %E\n"));
343 /* Check if the BFD passed in is an IR dummy object file. */
344 static inline bfd_boolean
345 is_ir_dummy_bfd (const bfd
*abfd
)
347 /* ABFD can sometimes legitimately be NULL, e.g. when called from one
348 of the linker callbacks for a symbol in the *ABS* or *UND* sections. */
349 return abfd
!= NULL
&& (abfd
->flags
& BFD_PLUGIN
) != 0;
352 /* Helpers to convert between BFD and GOLD symbol formats. */
353 static enum ld_plugin_status
354 asymbol_from_plugin_symbol (bfd
*abfd
, asymbol
*asym
,
355 const struct ld_plugin_symbol
*ldsym
)
357 flagword flags
= BSF_NO_FLAGS
;
358 struct bfd_section
*section
;
360 asym
->the_bfd
= abfd
;
361 asym
->name
= (ldsym
->version
362 ? concat (ldsym
->name
, "@", ldsym
->version
, (const char *) NULL
)
372 if (ldsym
->comdat_key
)
374 char *name
= concat (".gnu.linkonce.t.", ldsym
->comdat_key
,
375 (const char *) NULL
);
376 section
= bfd_get_section_by_name (abfd
, name
);
383 sflags
= (SEC_CODE
| SEC_HAS_CONTENTS
| SEC_READONLY
384 | SEC_ALLOC
| SEC_LOAD
| SEC_KEEP
| SEC_EXCLUDE
385 | SEC_LINK_ONCE
| SEC_LINK_DUPLICATES_DISCARD
);
386 section
= bfd_make_section_anyway_with_flags (abfd
, name
, sflags
);
392 section
= bfd_get_section_by_name (abfd
, ".text");
399 section
= bfd_und_section_ptr
;
404 section
= bfd_com_section_ptr
;
405 asym
->value
= ldsym
->size
;
412 asym
->section
= section
;
414 if (bfd_get_flavour (abfd
) == bfd_target_elf_flavour
)
416 elf_symbol_type
*elfsym
= elf_symbol_from (abfd
, asym
);
417 unsigned char visibility
;
420 einfo (_("%F%P: %s: non-ELF symbol in ELF BFD!\n"), asym
->name
);
422 if (ldsym
->def
== LDPK_COMMON
)
424 elfsym
->internal_elf_sym
.st_shndx
= SHN_COMMON
;
425 elfsym
->internal_elf_sym
.st_value
= 1;
428 switch (ldsym
->visibility
)
431 einfo (_("%F%P: unknown ELF symbol visibility: %d!\n"),
436 visibility
= STV_DEFAULT
;
439 visibility
= STV_PROTECTED
;
442 visibility
= STV_INTERNAL
;
445 visibility
= STV_HIDDEN
;
448 elfsym
->internal_elf_sym
.st_other
|= visibility
;
454 /* Register a claim-file handler. */
455 static enum ld_plugin_status
456 register_claim_file (ld_plugin_claim_file_handler handler
)
458 ASSERT (called_plugin
);
459 called_plugin
->claim_file_handler
= handler
;
463 /* Register an all-symbols-read handler. */
464 static enum ld_plugin_status
465 register_all_symbols_read (ld_plugin_all_symbols_read_handler handler
)
467 ASSERT (called_plugin
);
468 called_plugin
->all_symbols_read_handler
= handler
;
472 /* Register a cleanup handler. */
473 static enum ld_plugin_status
474 register_cleanup (ld_plugin_cleanup_handler handler
)
476 ASSERT (called_plugin
);
477 called_plugin
->cleanup_handler
= handler
;
481 /* Add symbols from a plugin-claimed input file. */
482 static enum ld_plugin_status
483 add_symbols (void *handle
, int nsyms
, const struct ld_plugin_symbol
*syms
)
486 plugin_input_file_t
*input
= handle
;
487 bfd
*abfd
= input
->abfd
;
490 ASSERT (called_plugin
);
491 symptrs
= xmalloc (nsyms
* sizeof *symptrs
);
492 for (n
= 0; n
< nsyms
; n
++)
494 enum ld_plugin_status rv
;
497 bfdsym
= bfd_make_empty_symbol (abfd
);
499 rv
= asymbol_from_plugin_symbol (abfd
, bfdsym
, syms
+ n
);
503 bfd_set_symtab (abfd
, symptrs
, nsyms
);
507 /* Get the input file information with an open (possibly re-opened)
509 static enum ld_plugin_status
510 get_input_file (const void *handle
, struct ld_plugin_input_file
*file
)
512 const plugin_input_file_t
*input
= handle
;
514 ASSERT (called_plugin
);
516 file
->name
= input
->name
;
517 file
->offset
= input
->offset
;
518 file
->filesize
= input
->filesize
;
519 file
->handle
= (void *) handle
;
524 /* Get view of the input file. */
525 static enum ld_plugin_status
526 get_view (const void *handle
, const void **viewp
)
528 plugin_input_file_t
*input
= (plugin_input_file_t
*) handle
;
530 size_t size
= input
->filesize
;
531 off_t offset
= input
->offset
;
532 #if HAVE_MMAP && HAVE_GETPAGESIZE
536 ASSERT (called_plugin
);
538 /* FIXME: einfo should support %lld. */
539 if ((off_t
) size
!= input
->filesize
)
540 einfo (_("%F%P: unsupported input file size: %s (%ld bytes)\n"),
541 input
->name
, (long) input
->filesize
);
543 /* Check the cached view buffer. */
544 if (input
->view_buffer
.addr
!= NULL
545 && input
->view_buffer
.filesize
== size
546 && input
->view_buffer
.offset
== offset
)
548 *viewp
= input
->view_buffer
.addr
;
552 input
->view_buffer
.filesize
= size
;
553 input
->view_buffer
.offset
= offset
;
556 # if HAVE_GETPAGESIZE
557 bias
= offset
% plugin_pagesize
;
561 buffer
= mmap (NULL
, size
, PROT_READ
, MAP_PRIVATE
, input
->fd
, offset
);
562 if (buffer
!= MAP_FAILED
)
564 input
->use_mmap
= TRUE
;
565 # if HAVE_GETPAGESIZE
574 input
->use_mmap
= FALSE
;
576 if (lseek (input
->fd
, offset
, SEEK_SET
) < 0)
579 buffer
= bfd_alloc (input
->abfd
, size
);
586 ssize_t got
= read (input
->fd
, p
, size
);
594 else if (errno
!= EINTR
)
600 input
->view_buffer
.addr
= buffer
;
606 /* Release the input file. */
607 static enum ld_plugin_status
608 release_input_file (const void *handle
)
610 plugin_input_file_t
*input
= (plugin_input_file_t
*) handle
;
611 ASSERT (called_plugin
);
620 /* Return TRUE if a defined symbol might be reachable from outside the
621 universe of claimed objects. */
622 static inline bfd_boolean
623 is_visible_from_outside (struct ld_plugin_symbol
*lsym
,
624 struct bfd_link_hash_entry
*blhe
)
626 if (bfd_link_relocatable (&link_info
))
628 if (blhe
->non_ir_ref_dynamic
629 || link_info
.export_dynamic
630 || bfd_link_dll (&link_info
))
632 /* Check if symbol is hidden by version script. */
633 if (bfd_hide_sym_by_version (link_info
.version_info
,
636 /* Only ELF symbols really have visibility. */
637 if (bfd_get_flavour (link_info
.output_bfd
) == bfd_target_elf_flavour
)
639 struct elf_link_hash_entry
*el
= (struct elf_link_hash_entry
*)blhe
;
640 int vis
= ELF_ST_VISIBILITY (el
->other
);
641 return vis
== STV_DEFAULT
|| vis
== STV_PROTECTED
;
643 /* On non-ELF targets, we can safely make inferences by considering
644 what visibility the plugin would have liked to apply when it first
645 sent us the symbol. During ELF symbol processing, visibility only
646 ever becomes more restrictive, not less, when symbols are merged,
647 so this is a conservative estimate; it may give false positives,
648 declaring something visible from outside when it in fact would
649 not have been, but this will only lead to missed optimisation
650 opportunities during LTRANS at worst; it will not give false
651 negatives, which can lead to the disastrous conclusion that the
652 related symbol is IRONLY. (See GCC PR46319 for an example.) */
653 return (lsym
->visibility
== LDPV_DEFAULT
654 || lsym
->visibility
== LDPV_PROTECTED
);
660 /* Return LTO kind string name that corresponds to IDX enum value. */
662 get_lto_kind (unsigned int idx
)
664 static char buffer
[64];
665 const char *lto_kind_str
[5] =
674 if (idx
< ARRAY_SIZE (lto_kind_str
))
675 return lto_kind_str
[idx
];
677 sprintf (buffer
, _("unknown LTO kind value %x"), idx
);
681 /* Return LTO resolution string name that corresponds to IDX enum value. */
683 get_lto_resolution (unsigned int idx
)
685 static char buffer
[64];
686 static const char *lto_resolution_str
[10] =
691 "PREVAILING_DEF_IRONLY",
697 "PREVAILING_DEF_IRONLY_EXP",
700 if (idx
< ARRAY_SIZE (lto_resolution_str
))
701 return lto_resolution_str
[idx
];
703 sprintf (buffer
, _("unknown LTO resolution value %x"), idx
);
707 /* Return LTO visibility string name that corresponds to IDX enum value. */
709 get_lto_visibility (unsigned int idx
)
711 static char buffer
[64];
712 const char *lto_visibility_str
[4] =
720 if (idx
< ARRAY_SIZE (lto_visibility_str
))
721 return lto_visibility_str
[idx
];
723 sprintf (buffer
, _("unknown LTO visibility value %x"), idx
);
727 /* Get the symbol resolution info for a plugin-claimed input file. */
728 static enum ld_plugin_status
729 get_symbols (const void *handle
, int nsyms
, struct ld_plugin_symbol
*syms
,
732 const plugin_input_file_t
*input
= handle
;
733 const bfd
*abfd
= (const bfd
*) input
->abfd
;
736 ASSERT (called_plugin
);
737 for (n
= 0; n
< nsyms
; n
++)
739 struct bfd_link_hash_entry
*blhe
;
742 struct bfd_link_hash_entry
*h
743 = bfd_link_hash_lookup (link_info
.hash
, syms
[n
].name
,
745 enum { wrap_none
, wrapper
, wrapped
} wrap_status
= wrap_none
;
747 if (syms
[n
].def
!= LDPK_UNDEF
&& syms
[n
].def
!= LDPK_WEAKUNDEF
)
750 if (blhe
&& link_info
.wrap_hash
!= NULL
)
752 /* Check if a symbol is a wrapper symbol. */
753 struct bfd_link_hash_entry
*unwrap
754 = unwrap_hash_lookup (&link_info
, (bfd
*) abfd
, blhe
);
755 if (unwrap
&& unwrap
!= h
)
756 wrap_status
= wrapper
;
761 blhe
= bfd_wrapped_link_hash_lookup (link_info
.output_bfd
,
762 &link_info
, syms
[n
].name
,
764 /* Check if a symbol is a wrapped symbol. */
765 if (blhe
&& blhe
!= h
)
766 wrap_status
= wrapped
;
770 /* The plugin is called to claim symbols in an archive element
771 from plugin_object_p. But those symbols aren't needed to
772 create output. They are defined and referenced only within
785 res
= LDPR_PREVAILING_DEF_IRONLY
;
791 /* Determine resolution from blhe type and symbol's original type. */
792 if (blhe
->type
== bfd_link_hash_undefined
793 || blhe
->type
== bfd_link_hash_undefweak
)
798 if (blhe
->type
!= bfd_link_hash_defined
799 && blhe
->type
!= bfd_link_hash_defweak
800 && blhe
->type
!= bfd_link_hash_common
)
802 /* We should not have a new, indirect or warning symbol here. */
803 einfo (_("%F%P: %s: plugin symbol table corrupt (sym type %d)\n"),
804 called_plugin
->name
, blhe
->type
);
807 /* Find out which section owns the symbol. Since it's not undef,
808 it must have an owner; if it's not a common symbol, both defs
809 and weakdefs keep it in the same place. */
810 owner_sec
= (blhe
->type
== bfd_link_hash_common
811 ? blhe
->u
.c
.p
->section
812 : blhe
->u
.def
.section
);
815 /* If it was originally undefined or common, then it has been
816 resolved; determine how. */
817 if (syms
[n
].def
== LDPK_UNDEF
818 || syms
[n
].def
== LDPK_WEAKUNDEF
819 || syms
[n
].def
== LDPK_COMMON
)
821 if (owner_sec
->owner
== link_info
.output_bfd
)
822 res
= LDPR_RESOLVED_EXEC
;
823 else if (owner_sec
->owner
== abfd
)
824 res
= LDPR_PREVAILING_DEF_IRONLY
;
825 else if (is_ir_dummy_bfd (owner_sec
->owner
))
826 res
= LDPR_RESOLVED_IR
;
827 else if (owner_sec
->owner
!= NULL
828 && (owner_sec
->owner
->flags
& DYNAMIC
) != 0)
829 res
= LDPR_RESOLVED_DYN
;
831 res
= LDPR_RESOLVED_EXEC
;
834 /* Was originally def, or weakdef. Does it prevail? If the
835 owner is the original dummy bfd that supplied it, then this
836 is the definition that has prevailed. */
837 else if (owner_sec
->owner
== link_info
.output_bfd
)
838 res
= LDPR_PREEMPTED_REG
;
839 else if (owner_sec
->owner
== abfd
)
840 res
= LDPR_PREVAILING_DEF_IRONLY
;
842 /* Was originally def, weakdef, or common, but has been pre-empted. */
843 else if (is_ir_dummy_bfd (owner_sec
->owner
))
844 res
= LDPR_PREEMPTED_IR
;
846 res
= LDPR_PREEMPTED_REG
;
848 if (res
== LDPR_PREVAILING_DEF_IRONLY
)
850 /* We need to know if the sym is referenced from non-IR files. Or
851 even potentially-referenced, perhaps in a future final link if
852 this is a partial one, perhaps dynamically at load-time if the
853 symbol is externally visible. Also check for wrapper symbol. */
854 if (blhe
->non_ir_ref_regular
|| wrap_status
== wrapper
)
855 res
= LDPR_PREVAILING_DEF
;
856 else if (wrap_status
== wrapped
)
857 res
= LDPR_RESOLVED_IR
;
858 else if (is_visible_from_outside (&syms
[n
], blhe
))
859 res
= def_ironly_exp
;
863 syms
[n
].resolution
= res
;
864 if (report_plugin_symbols
)
865 einfo (_("%P: %pB: symbol `%s' "
866 "definition: %s, visibility: %s, resolution: %s\n"),
868 get_lto_kind (syms
[n
].def
),
869 get_lto_visibility (syms
[n
].visibility
),
870 get_lto_resolution (res
));
875 static enum ld_plugin_status
876 get_symbols_v1 (const void *handle
, int nsyms
, struct ld_plugin_symbol
*syms
)
878 return get_symbols (handle
, nsyms
, syms
, LDPR_PREVAILING_DEF
);
881 static enum ld_plugin_status
882 get_symbols_v2 (const void *handle
, int nsyms
, struct ld_plugin_symbol
*syms
)
884 return get_symbols (handle
, nsyms
, syms
, LDPR_PREVAILING_DEF_IRONLY_EXP
);
887 /* Add a new (real) input file generated by a plugin. */
888 static enum ld_plugin_status
889 add_input_file (const char *pathname
)
891 lang_input_statement_type
*is
;
893 ASSERT (called_plugin
);
894 is
= lang_add_input_file (xstrdup (pathname
), lang_input_file_is_file_enum
,
898 is
->flags
.lto_output
= 1;
902 /* Add a new (real) library required by a plugin. */
903 static enum ld_plugin_status
904 add_input_library (const char *pathname
)
906 lang_input_statement_type
*is
;
908 ASSERT (called_plugin
);
909 is
= lang_add_input_file (xstrdup (pathname
), lang_input_file_is_l_enum
,
913 is
->flags
.lto_output
= 1;
917 /* Set the extra library path to be used by libraries added via
918 add_input_library. */
919 static enum ld_plugin_status
920 set_extra_library_path (const char *path
)
922 ASSERT (called_plugin
);
923 ldfile_add_library_path (xstrdup (path
), FALSE
);
927 /* Issue a diagnostic message from a plugin. */
928 static enum ld_plugin_status
929 message (int level
, const char *format
, ...)
932 va_start (args
, format
);
937 vfinfo (stdout
, format
, args
, FALSE
);
942 char *newfmt
= concat (_("%P: warning: "), format
, "\n",
943 (const char *) NULL
);
944 vfinfo (stdout
, newfmt
, args
, TRUE
);
952 char *newfmt
= concat (level
== LDPL_FATAL
? "%F" : "%X",
953 _("%P: error: "), format
, "\n",
954 (const char *) NULL
);
956 vfinfo (stderr
, newfmt
, args
, TRUE
);
967 /* Helper to size leading part of tv array and set it up. */
969 set_tv_header (struct ld_plugin_tv
*tv
)
974 static const unsigned int major
= (unsigned)(BFD_VERSION
/ 100000000UL);
975 static const unsigned int minor
= (unsigned)(BFD_VERSION
/ 1000000UL) % 100;
977 for (i
= 0; i
< tv_header_size
; i
++)
979 tv
[i
].tv_tag
= tv_header_tags
[i
];
980 #define TVU(x) tv[i].tv_u.tv_ ## x
981 switch (tv
[i
].tv_tag
)
984 TVU(message
) = message
;
986 case LDPT_API_VERSION
:
987 TVU(val
) = LD_PLUGIN_API_VERSION
;
989 case LDPT_GNU_LD_VERSION
:
990 TVU(val
) = major
* 100 + minor
;
992 case LDPT_LINKER_OUTPUT
:
993 TVU(val
) = (bfd_link_relocatable (&link_info
) ? LDPO_REL
994 : bfd_link_pde (&link_info
) ? LDPO_EXEC
995 : bfd_link_pie (&link_info
) ? LDPO_PIE
998 case LDPT_OUTPUT_NAME
:
999 TVU(string
) = output_filename
;
1001 case LDPT_REGISTER_CLAIM_FILE_HOOK
:
1002 TVU(register_claim_file
) = register_claim_file
;
1004 case LDPT_REGISTER_ALL_SYMBOLS_READ_HOOK
:
1005 TVU(register_all_symbols_read
) = register_all_symbols_read
;
1007 case LDPT_REGISTER_CLEANUP_HOOK
:
1008 TVU(register_cleanup
) = register_cleanup
;
1010 case LDPT_ADD_SYMBOLS
:
1011 TVU(add_symbols
) = add_symbols
;
1013 case LDPT_GET_INPUT_FILE
:
1014 TVU(get_input_file
) = get_input_file
;
1017 TVU(get_view
) = get_view
;
1019 case LDPT_RELEASE_INPUT_FILE
:
1020 TVU(release_input_file
) = release_input_file
;
1022 case LDPT_GET_SYMBOLS
:
1023 TVU(get_symbols
) = get_symbols_v1
;
1025 case LDPT_GET_SYMBOLS_V2
:
1026 TVU(get_symbols
) = get_symbols_v2
;
1028 case LDPT_ADD_INPUT_FILE
:
1029 TVU(add_input_file
) = add_input_file
;
1031 case LDPT_ADD_INPUT_LIBRARY
:
1032 TVU(add_input_library
) = add_input_library
;
1034 case LDPT_SET_EXTRA_LIBRARY_PATH
:
1035 TVU(set_extra_library_path
) = set_extra_library_path
;
1038 /* Added a new entry to the array without adding
1039 a new case to set up its value is a bug. */
1046 /* Append the per-plugin args list and trailing LDPT_NULL to tv. */
1048 set_tv_plugin_args (plugin_t
*plugin
, struct ld_plugin_tv
*tv
)
1050 plugin_arg_t
*arg
= plugin
->args
;
1053 tv
->tv_tag
= LDPT_OPTION
;
1054 tv
->tv_u
.tv_string
= arg
->arg
;
1058 tv
->tv_tag
= LDPT_NULL
;
1059 tv
->tv_u
.tv_val
= 0;
1062 /* Load up and initialise all plugins after argument parsing. */
1064 plugin_load_plugins (void)
1066 struct ld_plugin_tv
*my_tv
;
1067 unsigned int max_args
= 0;
1068 plugin_t
*curplug
= plugins_list
;
1070 /* If there are no plugins, we need do nothing this run. */
1074 /* First pass over plugins to find max # args needed so that we
1075 can size and allocate the tv array. */
1078 if (curplug
->n_args
> max_args
)
1079 max_args
= curplug
->n_args
;
1080 curplug
= curplug
->next
;
1083 /* Allocate tv array and initialise constant part. */
1084 my_tv
= xmalloc ((max_args
+ 1 + tv_header_size
) * sizeof *my_tv
);
1085 set_tv_header (my_tv
);
1087 /* Pass over plugins again, activating them. */
1088 curplug
= plugins_list
;
1091 enum ld_plugin_status rv
;
1092 ld_plugin_onload onloadfn
;
1094 onloadfn
= (ld_plugin_onload
) dlsym (curplug
->dlhandle
, "onload");
1096 onloadfn
= (ld_plugin_onload
) dlsym (curplug
->dlhandle
, "_onload");
1098 einfo (_("%F%P: %s: error loading plugin: %s\n"),
1099 curplug
->name
, dlerror ());
1100 set_tv_plugin_args (curplug
, &my_tv
[tv_header_size
]);
1101 called_plugin
= curplug
;
1102 rv
= (*onloadfn
) (my_tv
);
1103 called_plugin
= NULL
;
1105 einfo (_("%F%P: %s: plugin error: %d\n"), curplug
->name
, rv
);
1106 curplug
= curplug
->next
;
1109 /* Since plugin(s) inited ok, assume they're going to want symbol
1110 resolutions, which needs us to track which symbols are referenced
1111 by non-IR files using the linker's notice callback. */
1112 orig_notice_all
= link_info
.notice_all
;
1113 orig_callbacks
= link_info
.callbacks
;
1114 plugin_callbacks
= *orig_callbacks
;
1115 plugin_callbacks
.notice
= &plugin_notice
;
1116 link_info
.notice_all
= TRUE
;
1117 link_info
.lto_plugin_active
= TRUE
;
1118 link_info
.callbacks
= &plugin_callbacks
;
1120 register_ld_plugin_object_p (plugin_object_p
);
1122 #if HAVE_MMAP && HAVE_GETPAGESIZE
1123 plugin_pagesize
= getpagesize ();
1127 /* Call 'claim file' hook for all plugins. */
1129 plugin_call_claim_file (const struct ld_plugin_input_file
*file
, int *claimed
)
1131 plugin_t
*curplug
= plugins_list
;
1133 while (curplug
&& !*claimed
)
1135 if (curplug
->claim_file_handler
)
1137 enum ld_plugin_status rv
;
1139 called_plugin
= curplug
;
1140 rv
= (*curplug
->claim_file_handler
) (file
, claimed
);
1141 called_plugin
= NULL
;
1143 set_plugin_error (curplug
->name
);
1145 curplug
= curplug
->next
;
1147 return plugin_error_p () ? -1 : 0;
1150 /* Duplicates a character string with memory attached to ABFD. */
1153 plugin_strdup (bfd
*abfd
, const char *str
)
1157 strlength
= strlen (str
) + 1;
1158 copy
= bfd_alloc (abfd
, strlength
);
1160 einfo (_("%F%P: plugin_strdup failed to allocate memory: %s\n"),
1162 memcpy (copy
, str
, strlength
);
1166 static const bfd_target
*
1167 plugin_object_p (bfd
*ibfd
)
1170 plugin_input_file_t
*input
;
1171 struct ld_plugin_input_file file
;
1174 /* Don't try the dummy object file. */
1175 if ((ibfd
->flags
& BFD_PLUGIN
) != 0)
1178 if (ibfd
->plugin_format
!= bfd_plugin_unknown
)
1180 if (ibfd
->plugin_format
== bfd_plugin_yes
)
1181 return ibfd
->plugin_dummy_bfd
->xvec
;
1186 /* We create a dummy BFD, initially empty, to house whatever symbols
1187 the plugin may want to add. */
1188 abfd
= plugin_get_ir_dummy_bfd (ibfd
->filename
, ibfd
);
1190 input
= bfd_alloc (abfd
, sizeof (*input
));
1192 einfo (_("%F%P: plugin failed to allocate memory for input: %s\n"),
1195 if (!bfd_plugin_open_input (ibfd
, &file
))
1198 if (file
.name
== ibfd
->filename
)
1200 /* We must copy filename attached to ibfd if it is not an archive
1201 member since it may be freed by bfd_close below. */
1202 file
.name
= plugin_strdup (abfd
, file
.name
);
1205 file
.handle
= input
;
1207 input
->view_buffer
.addr
= NULL
;
1208 input
->view_buffer
.filesize
= 0;
1209 input
->view_buffer
.offset
= 0;
1210 input
->fd
= file
.fd
;
1211 input
->use_mmap
= FALSE
;
1212 input
->offset
= file
.offset
;
1213 input
->filesize
= file
.filesize
;
1214 input
->name
= plugin_strdup (abfd
, ibfd
->filename
);
1218 if (plugin_call_claim_file (&file
, &claimed
))
1219 einfo (_("%F%P: %s: plugin reported error claiming file\n"),
1220 plugin_error_plugin ());
1222 if (input
->fd
!= -1 && !bfd_plugin_target_p (ibfd
->xvec
))
1224 /* FIXME: fd belongs to us, not the plugin. GCC plugin, which
1225 doesn't need fd after plugin_call_claim_file, doesn't use
1226 BFD plugin target vector. Since GCC plugin doesn't call
1227 release_input_file, we close it here. LLVM plugin, which
1228 needs fd after plugin_call_claim_file and calls
1229 release_input_file after it is done, uses BFD plugin target
1230 vector. This scheme doesn't work when a plugin needs fd and
1231 doesn't use BFD plugin target vector neither. */
1238 ibfd
->plugin_format
= bfd_plugin_yes
;
1239 ibfd
->plugin_dummy_bfd
= abfd
;
1240 bfd_make_readable (abfd
);
1246 if (input
->use_mmap
)
1248 /* If plugin didn't claim the file, unmap the buffer. */
1249 char *addr
= input
->view_buffer
.addr
;
1250 off_t size
= input
->view_buffer
.filesize
;
1251 # if HAVE_GETPAGESIZE
1252 off_t bias
= input
->view_buffer
.offset
% plugin_pagesize
;
1256 munmap (addr
, size
);
1260 /* If plugin didn't claim the file, we don't need the dummy bfd.
1261 Can't avoid speculatively creating it, alas. */
1262 ibfd
->plugin_format
= bfd_plugin_no
;
1263 bfd_close_all_done (abfd
);
1269 plugin_maybe_claim (lang_input_statement_type
*entry
)
1271 ASSERT (entry
->header
.type
== lang_input_statement_enum
);
1272 if (plugin_object_p (entry
->the_bfd
))
1274 bfd
*abfd
= entry
->the_bfd
->plugin_dummy_bfd
;
1276 /* Discard the real file's BFD and substitute the dummy one. */
1278 /* We can't call bfd_close on archives. BFD archive handling
1279 caches elements, and add_archive_element keeps pointers to
1280 the_bfd and the_bfd->filename in a lang_input_statement_type
1281 linker script statement. */
1282 if (entry
->the_bfd
->my_archive
== NULL
)
1283 bfd_close (entry
->the_bfd
);
1284 entry
->the_bfd
= abfd
;
1285 entry
->flags
.claimed
= 1;
1289 /* Call 'all symbols read' hook for all plugins. */
1291 plugin_call_all_symbols_read (void)
1293 plugin_t
*curplug
= plugins_list
;
1295 /* Disable any further file-claiming. */
1296 no_more_claiming
= TRUE
;
1300 if (curplug
->all_symbols_read_handler
)
1302 enum ld_plugin_status rv
;
1303 called_plugin
= curplug
;
1304 rv
= (*curplug
->all_symbols_read_handler
) ();
1305 called_plugin
= NULL
;
1307 set_plugin_error (curplug
->name
);
1309 curplug
= curplug
->next
;
1311 return plugin_error_p () ? -1 : 0;
1314 /* Call 'cleanup' hook for all plugins at exit. */
1316 plugin_call_cleanup (void)
1318 plugin_t
*curplug
= plugins_list
;
1321 if (curplug
->cleanup_handler
&& !curplug
->cleanup_done
)
1323 enum ld_plugin_status rv
;
1324 curplug
->cleanup_done
= TRUE
;
1325 called_plugin
= curplug
;
1326 rv
= (*curplug
->cleanup_handler
) ();
1327 called_plugin
= NULL
;
1329 info_msg (_("%P: %s: error in plugin cleanup: %d (ignored)\n"),
1331 dlclose (curplug
->dlhandle
);
1333 curplug
= curplug
->next
;
1337 /* To determine which symbols should be resolved LDPR_PREVAILING_DEF
1338 and which LDPR_PREVAILING_DEF_IRONLY, we notice all the symbols as
1339 the linker adds them to the linker hash table. Mark those
1340 referenced from a non-IR file with non_ir_ref_regular or
1341 non_ir_ref_dynamic as appropriate. We have to notice_all symbols,
1342 because we won't necessarily know until later which ones will be
1343 contributed by IR files. */
1345 plugin_notice (struct bfd_link_info
*info
,
1346 struct bfd_link_hash_entry
*h
,
1347 struct bfd_link_hash_entry
*inh
,
1353 struct bfd_link_hash_entry
*orig_h
= h
;
1358 bfd_boolean ref
= FALSE
;
1360 if (h
->type
== bfd_link_hash_warning
)
1363 /* Nothing to do here if this def/ref is from an IR dummy BFD. */
1364 if (is_ir_dummy_bfd (abfd
))
1367 /* Making an indirect symbol counts as a reference unless this
1368 is a brand new symbol. */
1369 else if (bfd_is_ind_section (section
)
1370 || (flags
& BSF_INDIRECT
) != 0)
1372 /* ??? Some of this is questionable. See comments in
1373 _bfd_generic_link_add_one_symbol for case IND. */
1374 if (h
->type
!= bfd_link_hash_new
1375 || inh
->type
== bfd_link_hash_new
)
1377 if ((abfd
->flags
& DYNAMIC
) == 0)
1378 inh
->non_ir_ref_regular
= TRUE
;
1380 inh
->non_ir_ref_dynamic
= TRUE
;
1383 if (h
->type
!= bfd_link_hash_new
)
1387 /* Nothing to do here for warning symbols. */
1388 else if ((flags
& BSF_WARNING
) != 0)
1391 /* Nothing to do here for constructor symbols. */
1392 else if ((flags
& BSF_CONSTRUCTOR
) != 0)
1395 /* If this is a ref, set non_ir_ref. */
1396 else if (bfd_is_und_section (section
))
1398 /* Replace the undefined dummy bfd with the real one. */
1399 if ((h
->type
== bfd_link_hash_undefined
1400 || h
->type
== bfd_link_hash_undefweak
)
1401 && (h
->u
.undef
.abfd
== NULL
1402 || (h
->u
.undef
.abfd
->flags
& BFD_PLUGIN
) != 0))
1403 h
->u
.undef
.abfd
= abfd
;
1408 /* A common symbol should be merged with other commons or
1409 defs with the same name. In particular, a common ought
1410 to be overridden by a def in a -flto object. In that
1411 sense a common is also a ref. */
1412 else if (bfd_is_com_section (section
))
1414 if (h
->type
== bfd_link_hash_common
1415 && is_ir_dummy_bfd (sym_bfd
= h
->u
.c
.p
->section
->owner
))
1417 h
->type
= bfd_link_hash_undefweak
;
1418 h
->u
.undef
.abfd
= sym_bfd
;
1423 /* Otherwise, it must be a new def.
1424 Ensure any symbol defined in an IR dummy BFD takes on a
1425 new value from a real BFD. Weak symbols are not normally
1426 overridden by a new weak definition, and strong symbols
1427 will normally cause multiple definition errors. Avoid
1428 this by making the symbol appear to be undefined. */
1429 else if (((h
->type
== bfd_link_hash_defweak
1430 || h
->type
== bfd_link_hash_defined
)
1431 && is_ir_dummy_bfd (sym_bfd
= h
->u
.def
.section
->owner
))
1432 || (h
->type
== bfd_link_hash_common
1433 && is_ir_dummy_bfd (sym_bfd
= h
->u
.c
.p
->section
->owner
)))
1435 h
->type
= bfd_link_hash_undefweak
;
1436 h
->u
.undef
.abfd
= sym_bfd
;
1441 if ((abfd
->flags
& DYNAMIC
) == 0)
1442 h
->non_ir_ref_regular
= TRUE
;
1444 h
->non_ir_ref_dynamic
= TRUE
;
1448 /* Continue with cref/nocrossref/trace-sym processing. */
1451 || (info
->notice_hash
!= NULL
1452 && bfd_hash_lookup (info
->notice_hash
, orig_h
->root
.string
,
1453 FALSE
, FALSE
) != NULL
))
1454 return (*orig_callbacks
->notice
) (info
, orig_h
, inh
,
1455 abfd
, section
, value
, flags
);