PR24262, plugin search dir doesn't respect --libdir
[deliverable/binutils-gdb.git] / ld / plugin.c
CommitLineData
5d3236ee 1/* Plugin control for the GNU linker.
82704155 2 Copyright (C) 2010-2019 Free Software Foundation, Inc.
5d3236ee
DK
3
4 This file is part of the GNU Binutils.
5
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.
10
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.
15
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. */
20
21#include "sysdep.h"
22#include "libiberty.h"
23#include "bfd.h"
24#include "bfdlink.h"
25#include "bfdver.h"
26#include "ld.h"
27#include "ldmain.h"
28#include "ldmisc.h"
29#include "ldexp.h"
30#include "ldlang.h"
31#include "ldfile.h"
7d0b9ebc 32#include "plugin-api.h"
5ae0078c 33#include "../bfd/plugin.h"
5d3236ee 34#include "plugin.h"
5d3236ee 35#include "elf-bfd.h"
2aec968d
L
36#if HAVE_MMAP
37# include <sys/mman.h>
38# ifndef MAP_FAILED
39# define MAP_FAILED ((void *) -1)
40# endif
41# ifndef PROT_READ
42# define PROT_READ 0
43# endif
44# ifndef MAP_PRIVATE
45# define MAP_PRIVATE 0
46# endif
47#endif
f4b78d18
L
48#include <errno.h>
49#if !(defined(errno) || defined(_MSC_VER) && defined(_INC_ERRNO))
50extern int errno;
51#endif
3917d5d5 52#if !defined (HAVE_DLFCN_H) && defined (HAVE_WINDOWS_H)
f31d24a0 53#include <windows.h>
3917d5d5 54#endif
5d3236ee 55
1715a13c
L
56/* Report plugin symbols. */
57bfd_boolean report_plugin_symbols;
58
5d3236ee
DK
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
cf4dc96f
DK
61 plugin. For cosmetic use only; appears in maps, crefs etc. */
62#define IRONLY_SUFFIX " (symbol from plugin)"
5d3236ee
DK
63
64/* Stores a single argument passed to a plugin. */
65typedef struct plugin_arg
66{
67 struct plugin_arg *next;
68 const char *arg;
69} plugin_arg_t;
70
71/* Holds all details of a single plugin. */
72typedef struct plugin
73{
74 /* Next on the list of plugins, or NULL at end of chain. */
75 struct plugin *next;
76 /* The argument string given to --plugin. */
77 const char *name;
78 /* The shared library handle returned by dlopen. */
79 void *dlhandle;
80 /* The list of argument string given to --plugin-opt. */
81 plugin_arg_t *args;
82 /* Number of args in the list, for convenience. */
83 size_t n_args;
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;
90} plugin_t;
91
2aec968d
L
92typedef struct view_buffer
93{
94 char *addr;
95 size_t filesize;
96 off_t offset;
97} view_buffer_t;
98
f4b78d18
L
99/* The internal version of struct ld_plugin_input_file with a BFD
100 pointer. */
101typedef struct plugin_input_file
102{
103 bfd *abfd;
2aec968d 104 view_buffer_t view_buffer;
f4b78d18
L
105 char *name;
106 int fd;
38604796 107 bfd_boolean use_mmap;
f4b78d18
L
108 off_t offset;
109 off_t filesize;
110} plugin_input_file_t;
111
5d3236ee
DK
112/* The master list of all plugins. */
113static plugin_t *plugins_list = NULL;
114
115/* We keep a tail pointer for easy linking on the end. */
116static plugin_t **plugins_tail_chain_ptr = &plugins_list;
117
118/* The last plugin added to the list, for receiving args. */
119static plugin_t *last_plugin = NULL;
120
121/* The tail of the arg chain of the last plugin added to the list. */
122static plugin_arg_t **last_plugin_args_tail_chain_ptr = NULL;
123
124/* The plugin which is currently having a callback executed. */
125static plugin_t *called_plugin = NULL;
126
127/* Last plugin to cause an error, if any. */
128static const char *error_plugin = NULL;
129
24f58f47 130/* State of linker "notice" interface before we poked at it. */
9e2278f5 131static bfd_boolean orig_notice_all;
9e2278f5
AM
132
133/* Original linker callbacks, and the plugin version. */
134static const struct bfd_link_callbacks *orig_callbacks;
135static struct bfd_link_callbacks plugin_callbacks;
136
5d3236ee
DK
137/* Set at all symbols read time, to avoid recursively offering the plugin
138 its own newly-added input files and libs to claim. */
9e2278f5 139bfd_boolean no_more_claiming = FALSE;
5d3236ee 140
38604796
L
141#if HAVE_MMAP && HAVE_GETPAGESIZE
142/* Page size used by mmap. */
143static off_t plugin_pagesize;
144#endif
145
5d3236ee
DK
146/* List of tags to set in the constant leading part of the tv array. */
147static const enum ld_plugin_tag tv_header_tags[] =
148{
149 LDPT_MESSAGE,
150 LDPT_API_VERSION,
151 LDPT_GNU_LD_VERSION,
152 LDPT_LINKER_OUTPUT,
153 LDPT_OUTPUT_NAME,
154 LDPT_REGISTER_CLAIM_FILE_HOOK,
155 LDPT_REGISTER_ALL_SYMBOLS_READ_HOOK,
156 LDPT_REGISTER_CLEANUP_HOOK,
157 LDPT_ADD_SYMBOLS,
158 LDPT_GET_INPUT_FILE,
15f7a26b 159 LDPT_GET_VIEW,
5d3236ee
DK
160 LDPT_RELEASE_INPUT_FILE,
161 LDPT_GET_SYMBOLS,
69ee6ab2 162 LDPT_GET_SYMBOLS_V2,
5d3236ee
DK
163 LDPT_ADD_INPUT_FILE,
164 LDPT_ADD_INPUT_LIBRARY,
165 LDPT_SET_EXTRA_LIBRARY_PATH
166};
167
168/* How many entries in the constant leading part of the tv array. */
169static const size_t tv_header_size = ARRAY_SIZE (tv_header_tags);
170
9e2278f5 171/* Forward references. */
16d96b5b 172static bfd_boolean plugin_notice (struct bfd_link_info *,
46135103
AM
173 struct bfd_link_hash_entry *,
174 struct bfd_link_hash_entry *,
175 bfd *, asection *, bfd_vma, flagword);
9e2278f5 176
5ae0078c
L
177static const bfd_target * plugin_object_p (bfd *);
178
3917d5d5
DK
179#if !defined (HAVE_DLFCN_H) && defined (HAVE_WINDOWS_H)
180
181#define RTLD_NOW 0 /* Dummy value. */
182
183static void *
184dlopen (const char *file, int mode ATTRIBUTE_UNUSED)
185{
186 return LoadLibrary (file);
187}
188
189static void *
190dlsym (void *handle, const char *name)
191{
192 return GetProcAddress (handle, name);
193}
194
195static int
196dlclose (void *handle)
197{
198 FreeLibrary (handle);
199 return 0;
200}
201
202#endif /* !defined (HAVE_DLFCN_H) && defined (HAVE_WINDOWS_H) */
203
d82184d7
L
204#ifndef HAVE_DLFCN_H
205static const char *
206dlerror (void)
207{
208 return "";
209}
210#endif
211
5d3236ee
DK
212/* Helper function for exiting with error status. */
213static int
214set_plugin_error (const char *plugin)
215{
216 error_plugin = plugin;
217 return -1;
218}
219
220/* Test if an error occurred. */
221static bfd_boolean
222plugin_error_p (void)
223{
224 return error_plugin != NULL;
225}
226
227/* Return name of plugin which caused an error if any. */
d44ad554
DK
228const char *
229plugin_error_plugin (void)
5d3236ee
DK
230{
231 return error_plugin ? error_plugin : _("<no plugin>");
232}
233
234/* Handle -plugin arg: find and load plugin, or return error. */
d82184d7 235void
d44ad554 236plugin_opt_plugin (const char *plugin)
5d3236ee
DK
237{
238 plugin_t *newplug;
c3e1c28e 239 plugin_t *curplug = plugins_list;
5d3236ee
DK
240
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)
df5f2391 246 einfo (_("%F%P: %s: error loading plugin: %s\n"), plugin, dlerror ());
5d3236ee 247
c3e1c28e
L
248 /* Check if plugin has been loaded already. */
249 while (curplug)
250 {
251 if (newplug->dlhandle == curplug->dlhandle)
252 {
253 einfo (_("%P: %s: duplicated plugin\n"), plugin);
254 free (newplug);
255 return;
256 }
257 curplug = curplug->next;
258 }
259
5d3236ee
DK
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;
263
264 /* Record it as current plugin for receiving args. */
265 last_plugin = newplug;
266 last_plugin_args_tail_chain_ptr = &newplug->args;
5d3236ee
DK
267}
268
269/* Accumulate option arguments for last-loaded plugin, or return
270 error if none. */
d44ad554
DK
271int
272plugin_opt_plugin_arg (const char *arg)
5d3236ee
DK
273{
274 plugin_arg_t *newarg;
275
276 if (!last_plugin)
277 return set_plugin_error (_("<no plugin>"));
278
97964ab3
AM
279 /* Ignore -pass-through= from GCC driver. */
280 if (*arg == '-')
281 {
282 const char *p = arg + 1;
283
284 if (*p == '-')
285 ++p;
286 if (strncmp (p, "pass-through=", 13) == 0)
287 return 0;
288 }
289
5d3236ee
DK
290 newarg = xmalloc (sizeof *newarg);
291 newarg->arg = arg;
292 newarg->next = NULL;
293
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++;
298 return 0;
299}
300
37a3056a
L
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. */
306static bfd *
5d3236ee
DK
307plugin_get_ir_dummy_bfd (const char *name, bfd *srctemplate)
308{
bc110b6e 309 bfd *abfd;
4a07dc81 310 bfd_boolean bfd_plugin_target;
bc110b6e
AM
311
312 bfd_use_reserved_id = 1;
4a07dc81 313 bfd_plugin_target = bfd_plugin_target_p (srctemplate->xvec);
9e2278f5 314 abfd = bfd_create (concat (name, IRONLY_SUFFIX, (const char *) NULL),
4a07dc81 315 bfd_plugin_target ? link_info.output_bfd : srctemplate);
9e2278f5
AM
316 if (abfd != NULL)
317 {
318 abfd->flags |= BFD_LINKER_CREATED | BFD_PLUGIN;
5ae0078c
L
319 if (!bfd_make_writable (abfd))
320 goto report_error;
4a07dc81 321 if (!bfd_plugin_target)
5ae0078c
L
322 {
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))
326 goto report_error;
327 }
9e2278f5
AM
328 {
329 flagword flags;
330
c77ec726 331 /* Create section to own the symbols. */
9e2278f5
AM
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))
335 return abfd;
336 }
337 }
5ae0078c 338report_error:
df5f2391 339 einfo (_("%F%P: could not create dummy IR bfd: %E\n"));
9e2278f5 340 return NULL;
5d3236ee
DK
341}
342
d44ad554 343/* Check if the BFD passed in is an IR dummy object file. */
23ebe1a0 344static inline bfd_boolean
5d3236ee
DK
345is_ir_dummy_bfd (const bfd *abfd)
346{
cf4dc96f 347 /* ABFD can sometimes legitimately be NULL, e.g. when called from one
23ebe1a0
AM
348 of the linker callbacks for a symbol in the *ABS* or *UND* sections. */
349 return abfd != NULL && (abfd->flags & BFD_PLUGIN) != 0;
5d3236ee
DK
350}
351
352/* Helpers to convert between BFD and GOLD symbol formats. */
353static enum ld_plugin_status
354asymbol_from_plugin_symbol (bfd *abfd, asymbol *asym,
f84854b6 355 const struct ld_plugin_symbol *ldsym)
5d3236ee
DK
356{
357 flagword flags = BSF_NO_FLAGS;
358 struct bfd_section *section;
359
360 asym->the_bfd = abfd;
f84854b6 361 asym->name = (ldsym->version
9e2278f5 362 ? concat (ldsym->name, "@", ldsym->version, (const char *) NULL)
f84854b6 363 : ldsym->name);
5d3236ee
DK
364 asym->value = 0;
365 switch (ldsym->def)
366 {
367 case LDPK_WEAKDEF:
368 flags = BSF_WEAK;
369 /* FALLTHRU */
370 case LDPK_DEF:
371 flags |= BSF_GLOBAL;
c77ec726
AM
372 if (ldsym->comdat_key)
373 {
374 char *name = concat (".gnu.linkonce.t.", ldsym->comdat_key,
375 (const char *) NULL);
376 section = bfd_get_section_by_name (abfd, name);
377 if (section != NULL)
378 free (name);
379 else
380 {
381 flagword sflags;
382
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);
387 if (section == NULL)
388 return LDPS_ERR;
389 }
390 }
391 else
392 section = bfd_get_section_by_name (abfd, ".text");
5d3236ee
DK
393 break;
394
395 case LDPK_WEAKUNDEF:
396 flags = BSF_WEAK;
397 /* FALLTHRU */
398 case LDPK_UNDEF:
399 section = bfd_und_section_ptr;
400 break;
401
402 case LDPK_COMMON:
403 flags = BSF_GLOBAL;
404 section = bfd_com_section_ptr;
405 asym->value = ldsym->size;
406 break;
407
408 default:
409 return LDPS_ERR;
410 }
411 asym->flags = flags;
412 asym->section = section;
413
5d3236ee
DK
414 if (bfd_get_flavour (abfd) == bfd_target_elf_flavour)
415 {
416 elf_symbol_type *elfsym = elf_symbol_from (abfd, asym);
cfac8028
L
417 unsigned char visibility;
418
5d3236ee 419 if (!elfsym)
df5f2391 420 einfo (_("%F%P: %s: non-ELF symbol in ELF BFD!\n"), asym->name);
0410b450
AM
421
422 if (ldsym->def == LDPK_COMMON)
423 {
424 elfsym->internal_elf_sym.st_shndx = SHN_COMMON;
425 elfsym->internal_elf_sym.st_value = 1;
426 }
427
cfac8028
L
428 switch (ldsym->visibility)
429 {
430 default:
df5f2391 431 einfo (_("%F%P: unknown ELF symbol visibility: %d!\n"),
cfac8028 432 ldsym->visibility);
2b804145
AM
433 return LDPS_ERR;
434
cfac8028
L
435 case LDPV_DEFAULT:
436 visibility = STV_DEFAULT;
437 break;
438 case LDPV_PROTECTED:
439 visibility = STV_PROTECTED;
440 break;
441 case LDPV_INTERNAL:
442 visibility = STV_INTERNAL;
443 break;
444 case LDPV_HIDDEN:
445 visibility = STV_HIDDEN;
446 break;
447 }
0410b450 448 elfsym->internal_elf_sym.st_other |= visibility;
5d3236ee
DK
449 }
450
451 return LDPS_OK;
452}
453
454/* Register a claim-file handler. */
455static enum ld_plugin_status
456register_claim_file (ld_plugin_claim_file_handler handler)
457{
458 ASSERT (called_plugin);
459 called_plugin->claim_file_handler = handler;
460 return LDPS_OK;
461}
462
463/* Register an all-symbols-read handler. */
464static enum ld_plugin_status
465register_all_symbols_read (ld_plugin_all_symbols_read_handler handler)
466{
467 ASSERT (called_plugin);
468 called_plugin->all_symbols_read_handler = handler;
469 return LDPS_OK;
470}
471
472/* Register a cleanup handler. */
473static enum ld_plugin_status
474register_cleanup (ld_plugin_cleanup_handler handler)
475{
476 ASSERT (called_plugin);
477 called_plugin->cleanup_handler = handler;
478 return LDPS_OK;
479}
480
481/* Add symbols from a plugin-claimed input file. */
482static enum ld_plugin_status
483add_symbols (void *handle, int nsyms, const struct ld_plugin_symbol *syms)
484{
485 asymbol **symptrs;
f4b78d18
L
486 plugin_input_file_t *input = handle;
487 bfd *abfd = input->abfd;
7fe550fc 488 int n;
43e1669b 489
5d3236ee
DK
490 ASSERT (called_plugin);
491 symptrs = xmalloc (nsyms * sizeof *symptrs);
7fe550fc 492 for (n = 0; n < nsyms; n++)
5d3236ee
DK
493 {
494 enum ld_plugin_status rv;
0c511000
AM
495 asymbol *bfdsym;
496
0c511000 497 bfdsym = bfd_make_empty_symbol (abfd);
7fe550fc 498 symptrs[n] = bfdsym;
5d3236ee
DK
499 rv = asymbol_from_plugin_symbol (abfd, bfdsym, syms + n);
500 if (rv != LDPS_OK)
501 return rv;
502 }
7fe550fc 503 bfd_set_symtab (abfd, symptrs, nsyms);
5d3236ee
DK
504 return LDPS_OK;
505}
506
507/* Get the input file information with an open (possibly re-opened)
508 file descriptor. */
509static enum ld_plugin_status
f4b78d18 510get_input_file (const void *handle, struct ld_plugin_input_file *file)
5d3236ee 511{
f4b78d18
L
512 const plugin_input_file_t *input = handle;
513
5d3236ee 514 ASSERT (called_plugin);
f4b78d18
L
515
516 file->name = input->name;
517 file->offset = input->offset;
518 file->filesize = input->filesize;
519 file->handle = (void *) handle;
520
521 return LDPS_OK;
5d3236ee
DK
522}
523
15f7a26b
L
524/* Get view of the input file. */
525static enum ld_plugin_status
f4b78d18 526get_view (const void *handle, const void **viewp)
15f7a26b 527{
2aec968d 528 plugin_input_file_t *input = (plugin_input_file_t *) handle;
f4b78d18 529 char *buffer;
2aec968d 530 size_t size = input->filesize;
38604796
L
531 off_t offset = input->offset;
532#if HAVE_MMAP && HAVE_GETPAGESIZE
533 off_t bias;
fe905789 534#endif
f4b78d18 535
15f7a26b 536 ASSERT (called_plugin);
f4b78d18 537
2aec968d
L
538 /* FIXME: einfo should support %lld. */
539 if ((off_t) size != input->filesize)
df5f2391 540 einfo (_("%F%P: unsupported input file size: %s (%ld bytes)\n"),
2aec968d 541 input->name, (long) input->filesize);
f4b78d18 542
2aec968d
L
543 /* Check the cached view buffer. */
544 if (input->view_buffer.addr != NULL
545 && input->view_buffer.filesize == size
38604796 546 && input->view_buffer.offset == offset)
2aec968d
L
547 {
548 *viewp = input->view_buffer.addr;
549 return LDPS_OK;
550 }
551
552 input->view_buffer.filesize = size;
38604796 553 input->view_buffer.offset = offset;
f4b78d18 554
2aec968d 555#if HAVE_MMAP
fe905789 556# if HAVE_GETPAGESIZE
38604796
L
557 bias = offset % plugin_pagesize;
558 offset -= bias;
fe905789
L
559 size += bias;
560# endif
561 buffer = mmap (NULL, size, PROT_READ, MAP_PRIVATE, input->fd, offset);
562 if (buffer != MAP_FAILED)
38604796
L
563 {
564 input->use_mmap = TRUE;
565# if HAVE_GETPAGESIZE
566 buffer += bias;
b677c456 567# endif
38604796
L
568 }
569 else
2aec968d 570#endif
f4b78d18 571 {
2aec968d
L
572 char *p;
573
38604796
L
574 input->use_mmap = FALSE;
575
576 if (lseek (input->fd, offset, SEEK_SET) < 0)
2aec968d
L
577 return LDPS_ERR;
578
579 buffer = bfd_alloc (input->abfd, size);
580 if (buffer == NULL)
581 return LDPS_ERR;
582
583 p = buffer;
584 do
f4b78d18 585 {
2aec968d
L
586 ssize_t got = read (input->fd, p, size);
587 if (got == 0)
588 break;
589 else if (got > 0)
590 {
591 p += got;
592 size -= got;
593 }
594 else if (errno != EINTR)
595 return LDPS_ERR;
f4b78d18 596 }
2aec968d 597 while (size > 0);
f4b78d18 598 }
2aec968d
L
599
600 input->view_buffer.addr = buffer;
601 *viewp = buffer;
f4b78d18
L
602
603 return LDPS_OK;
15f7a26b
L
604}
605
5d3236ee
DK
606/* Release the input file. */
607static enum ld_plugin_status
f4b78d18 608release_input_file (const void *handle)
5d3236ee 609{
119d62ff 610 plugin_input_file_t *input = (plugin_input_file_t *) handle;
5d3236ee 611 ASSERT (called_plugin);
f4b78d18 612 if (input->fd != -1)
119d62ff
L
613 {
614 close (input->fd);
615 input->fd = -1;
616 }
f4b78d18 617 return LDPS_OK;
5d3236ee
DK
618}
619
42a851a9
DK
620/* Return TRUE if a defined symbol might be reachable from outside the
621 universe of claimed objects. */
622static inline bfd_boolean
9bbc1a67 623is_visible_from_outside (struct ld_plugin_symbol *lsym,
f84854b6 624 struct bfd_link_hash_entry *blhe)
42a851a9 625{
0e1862bb 626 if (bfd_link_relocatable (&link_info))
42a851a9 627 return TRUE;
4070765b 628 if (blhe->non_ir_ref_dynamic
59fa66c5
L
629 || link_info.export_dynamic
630 || bfd_link_dll (&link_info))
42a851a9 631 {
fd91d419
L
632 /* Check if symbol is hidden by version script. */
633 if (bfd_hide_sym_by_version (link_info.version_info,
634 blhe->root.string))
635 return FALSE;
42a851a9
DK
636 /* Only ELF symbols really have visibility. */
637 if (bfd_get_flavour (link_info.output_bfd) == bfd_target_elf_flavour)
638 {
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;
642 }
643 /* On non-ELF targets, we can safely make inferences by considering
f84854b6 644 what visibility the plugin would have liked to apply when it first
42a851a9
DK
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.) */
cfac8028
L
653 return (lsym->visibility == LDPV_DEFAULT
654 || lsym->visibility == LDPV_PROTECTED);
42a851a9 655 }
35ed3f94 656
42a851a9
DK
657 return FALSE;
658}
659
8e5cb9a5 660/* Return LTO kind string name that corresponds to IDX enum value. */
7ea79cb3 661static const char *
8e5cb9a5 662get_lto_kind (unsigned int idx)
7ea79cb3 663{
664 static char buffer[64];
665 const char *lto_kind_str[5] =
666 {
667 "DEF",
668 "WEAKDEF",
669 "UNDEF",
670 "WEAKUNDEF",
671 "COMMON"
672 };
673
8e5cb9a5
JB
674 if (idx < ARRAY_SIZE (lto_kind_str))
675 return lto_kind_str [idx];
7ea79cb3 676
8e5cb9a5 677 sprintf (buffer, _("unknown LTO kind value %x"), idx);
7ea79cb3 678 return buffer;
679}
680
8e5cb9a5 681/* Return LTO resolution string name that corresponds to IDX enum value. */
7ea79cb3 682static const char *
8e5cb9a5 683get_lto_resolution (unsigned int idx)
7ea79cb3 684{
685 static char buffer[64];
686 static const char *lto_resolution_str[10] =
687 {
688 "UNKNOWN",
689 "UNDEF",
690 "PREVAILING_DEF",
691 "PREVAILING_DEF_IRONLY",
692 "PREEMPTED_REG",
693 "PREEMPTED_IR",
694 "RESOLVED_IR",
695 "RESOLVED_EXEC",
696 "RESOLVED_DYN",
697 "PREVAILING_DEF_IRONLY_EXP",
698 };
699
8e5cb9a5
JB
700 if (idx < ARRAY_SIZE (lto_resolution_str))
701 return lto_resolution_str [idx];
7ea79cb3 702
8e5cb9a5 703 sprintf (buffer, _("unknown LTO resolution value %x"), idx);
7ea79cb3 704 return buffer;
705}
706
8e5cb9a5 707/* Return LTO visibility string name that corresponds to IDX enum value. */
7ea79cb3 708static const char *
8e5cb9a5 709get_lto_visibility (unsigned int idx)
7ea79cb3 710{
711 static char buffer[64];
712 const char *lto_visibility_str[4] =
713 {
714 "DEFAULT",
715 "PROTECTED",
716 "INTERNAL",
717 "HIDDEN"
718 };
719
8e5cb9a5
JB
720 if (idx < ARRAY_SIZE (lto_visibility_str))
721 return lto_visibility_str [idx];
7ea79cb3 722
8e5cb9a5 723 sprintf (buffer, _("unknown LTO visibility value %x"), idx);
7ea79cb3 724 return buffer;
725}
726
5d3236ee
DK
727/* Get the symbol resolution info for a plugin-claimed input file. */
728static enum ld_plugin_status
69ee6ab2
AM
729get_symbols (const void *handle, int nsyms, struct ld_plugin_symbol *syms,
730 int def_ironly_exp)
5d3236ee 731{
f4b78d18
L
732 const plugin_input_file_t *input = handle;
733 const bfd *abfd = (const bfd *) input->abfd;
5d3236ee 734 int n;
69ee6ab2 735
5d3236ee
DK
736 ASSERT (called_plugin);
737 for (n = 0; n < nsyms; n++)
738 {
739 struct bfd_link_hash_entry *blhe;
42a851a9 740 asection *owner_sec;
69ee6ab2 741 int res;
6fe014bc
L
742 struct bfd_link_hash_entry *h
743 = bfd_link_hash_lookup (link_info.hash, syms[n].name,
744 FALSE, FALSE, TRUE);
745 enum { wrap_none, wrapper, wrapped } wrap_status = wrap_none;
69ee6ab2 746
6fe014bc
L
747 if (syms[n].def != LDPK_UNDEF && syms[n].def != LDPK_WEAKUNDEF)
748 {
749 blhe = h;
a78fca7b 750 if (blhe && link_info.wrap_hash != NULL)
6fe014bc
L
751 {
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;
757 }
758 }
10be1b6a 759 else
6fe014bc
L
760 {
761 blhe = bfd_wrapped_link_hash_lookup (link_info.output_bfd,
762 &link_info, syms[n].name,
763 FALSE, FALSE, TRUE);
764 /* Check if a symbol is a wrapped symbol. */
765 if (blhe && blhe != h)
766 wrap_status = wrapped;
767 }
5d3236ee
DK
768 if (!blhe)
769 {
3355cb3b
L
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
773 IR. */
774 switch (syms[n].def)
775 {
776 default:
777 abort ();
778 case LDPK_UNDEF:
779 case LDPK_WEAKUNDEF:
780 res = LDPR_UNDEF;
781 break;
782 case LDPK_DEF:
783 case LDPK_WEAKDEF:
784 case LDPK_COMMON:
785 res = LDPR_PREVAILING_DEF_IRONLY;
786 break;
787 }
1715a13c 788 goto report_symbol;
5d3236ee
DK
789 }
790
791 /* Determine resolution from blhe type and symbol's original type. */
792 if (blhe->type == bfd_link_hash_undefined
f84854b6 793 || blhe->type == bfd_link_hash_undefweak)
5d3236ee 794 {
69ee6ab2 795 res = LDPR_UNDEF;
1715a13c 796 goto report_symbol;
5d3236ee
DK
797 }
798 if (blhe->type != bfd_link_hash_defined
f84854b6
L
799 && blhe->type != bfd_link_hash_defweak
800 && blhe->type != bfd_link_hash_common)
5d3236ee
DK
801 {
802 /* We should not have a new, indirect or warning symbol here. */
df5f2391 803 einfo (_("%F%P: %s: plugin symbol table corrupt (sym type %d)\n"),
f84854b6 804 called_plugin->name, blhe->type);
5d3236ee
DK
805 }
806
42a851a9
DK
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. */
9e2278f5
AM
810 owner_sec = (blhe->type == bfd_link_hash_common
811 ? blhe->u.c.p->section
812 : blhe->u.def.section);
42a851a9 813
5d3236ee
DK
814
815 /* If it was originally undefined or common, then it has been
f84854b6
L
816 resolved; determine how. */
817 if (syms[n].def == LDPK_UNDEF
818 || syms[n].def == LDPK_WEAKUNDEF
5d3236ee
DK
819 || syms[n].def == LDPK_COMMON)
820 {
5d3236ee 821 if (owner_sec->owner == link_info.output_bfd)
69ee6ab2 822 res = LDPR_RESOLVED_EXEC;
5d3236ee 823 else if (owner_sec->owner == abfd)
69ee6ab2 824 res = LDPR_PREVAILING_DEF_IRONLY;
5d3236ee 825 else if (is_ir_dummy_bfd (owner_sec->owner))
69ee6ab2 826 res = LDPR_RESOLVED_IR;
cc322803
L
827 else if (owner_sec->owner != NULL
828 && (owner_sec->owner->flags & DYNAMIC) != 0)
69ee6ab2 829 res = LDPR_RESOLVED_DYN;
5d3236ee 830 else
69ee6ab2 831 res = LDPR_RESOLVED_EXEC;
5d3236ee
DK
832 }
833
834 /* Was originally def, or weakdef. Does it prevail? If the
f84854b6 835 owner is the original dummy bfd that supplied it, then this
5d3236ee 836 is the definition that has prevailed. */
69ee6ab2
AM
837 else if (owner_sec->owner == link_info.output_bfd)
838 res = LDPR_PREEMPTED_REG;
42a851a9 839 else if (owner_sec->owner == abfd)
69ee6ab2 840 res = LDPR_PREVAILING_DEF_IRONLY;
5d3236ee
DK
841
842 /* Was originally def, weakdef, or common, but has been pre-empted. */
69ee6ab2
AM
843 else if (is_ir_dummy_bfd (owner_sec->owner))
844 res = LDPR_PREEMPTED_IR;
845 else
846 res = LDPR_PREEMPTED_REG;
847
848 if (res == LDPR_PREVAILING_DEF_IRONLY)
849 {
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
6fe014bc
L
853 symbol is externally visible. Also check for wrapper symbol. */
854 if (blhe->non_ir_ref_regular || wrap_status == wrapper)
69ee6ab2 855 res = LDPR_PREVAILING_DEF;
6fe014bc
L
856 else if (wrap_status == wrapped)
857 res = LDPR_RESOLVED_IR;
9bbc1a67 858 else if (is_visible_from_outside (&syms[n], blhe))
69ee6ab2
AM
859 res = def_ironly_exp;
860 }
1715a13c 861
9e2278f5 862 report_symbol:
69ee6ab2 863 syms[n].resolution = res;
1715a13c 864 if (report_plugin_symbols)
871b3ab2 865 einfo (_("%P: %pB: symbol `%s' "
7ea79cb3 866 "definition: %s, visibility: %s, resolution: %s\n"),
9e2278f5 867 abfd, syms[n].name,
7ea79cb3 868 get_lto_kind (syms[n].def),
869 get_lto_visibility (syms[n].visibility),
870 get_lto_resolution (res));
5d3236ee
DK
871 }
872 return LDPS_OK;
873}
874
69ee6ab2
AM
875static enum ld_plugin_status
876get_symbols_v1 (const void *handle, int nsyms, struct ld_plugin_symbol *syms)
877{
878 return get_symbols (handle, nsyms, syms, LDPR_PREVAILING_DEF);
879}
880
881static enum ld_plugin_status
882get_symbols_v2 (const void *handle, int nsyms, struct ld_plugin_symbol *syms)
883{
884 return get_symbols (handle, nsyms, syms, LDPR_PREVAILING_DEF_IRONLY_EXP);
885}
886
5d3236ee
DK
887/* Add a new (real) input file generated by a plugin. */
888static enum ld_plugin_status
889add_input_file (const char *pathname)
890{
ce875075
AM
891 lang_input_statement_type *is;
892
5d3236ee 893 ASSERT (called_plugin);
ce875075
AM
894 is = lang_add_input_file (xstrdup (pathname), lang_input_file_is_file_enum,
895 NULL);
896 if (!is)
5d3236ee 897 return LDPS_ERR;
ce875075 898 is->flags.lto_output = 1;
5d3236ee
DK
899 return LDPS_OK;
900}
901
902/* Add a new (real) library required by a plugin. */
903static enum ld_plugin_status
904add_input_library (const char *pathname)
905{
ce875075
AM
906 lang_input_statement_type *is;
907
5d3236ee 908 ASSERT (called_plugin);
ce875075
AM
909 is = lang_add_input_file (xstrdup (pathname), lang_input_file_is_l_enum,
910 NULL);
911 if (!is)
5d3236ee 912 return LDPS_ERR;
ce875075 913 is->flags.lto_output = 1;
5d3236ee
DK
914 return LDPS_OK;
915}
916
917/* Set the extra library path to be used by libraries added via
918 add_input_library. */
919static enum ld_plugin_status
920set_extra_library_path (const char *path)
921{
922 ASSERT (called_plugin);
d4cb7acd 923 ldfile_add_library_path (xstrdup (path), FALSE);
5d3236ee
DK
924 return LDPS_OK;
925}
926
927/* Issue a diagnostic message from a plugin. */
928static enum ld_plugin_status
929message (int level, const char *format, ...)
930{
931 va_list args;
932 va_start (args, format);
933
934 switch (level)
935 {
936 case LDPL_INFO:
937 vfinfo (stdout, format, args, FALSE);
d251c5c4 938 putchar ('\n');
5d3236ee
DK
939 break;
940 case LDPL_WARNING:
45e81354 941 {
df5f2391 942 char *newfmt = concat (_("%P: warning: "), format, "\n",
e1fa0163 943 (const char *) NULL);
45e81354 944 vfinfo (stdout, newfmt, args, TRUE);
e1fa0163 945 free (newfmt);
45e81354 946 }
5d3236ee
DK
947 break;
948 case LDPL_FATAL:
949 case LDPL_ERROR:
950 default:
9e2278f5 951 {
df5f2391
AM
952 char *newfmt = concat (level == LDPL_FATAL ? "%F" : "%X",
953 _("%P: error: "), format, "\n",
e1fa0163 954 (const char *) NULL);
9e2278f5
AM
955 fflush (stdout);
956 vfinfo (stderr, newfmt, args, TRUE);
957 fflush (stderr);
e1fa0163 958 free (newfmt);
9e2278f5 959 }
5d3236ee
DK
960 break;
961 }
962
963 va_end (args);
964 return LDPS_OK;
965}
966
967/* Helper to size leading part of tv array and set it up. */
69ee6ab2 968static void
5d3236ee
DK
969set_tv_header (struct ld_plugin_tv *tv)
970{
971 size_t i;
972
973 /* Version info. */
974 static const unsigned int major = (unsigned)(BFD_VERSION / 100000000UL);
975 static const unsigned int minor = (unsigned)(BFD_VERSION / 1000000UL) % 100;
976
5d3236ee
DK
977 for (i = 0; i < tv_header_size; i++)
978 {
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)
982 {
f84854b6
L
983 case LDPT_MESSAGE:
984 TVU(message) = message;
985 break;
986 case LDPT_API_VERSION:
987 TVU(val) = LD_PLUGIN_API_VERSION;
988 break;
989 case LDPT_GNU_LD_VERSION:
990 TVU(val) = major * 100 + minor;
991 break;
992 case LDPT_LINKER_OUTPUT:
64d94ba0
AM
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
996 : LDPO_DYN);
f84854b6
L
997 break;
998 case LDPT_OUTPUT_NAME:
999 TVU(string) = output_filename;
1000 break;
1001 case LDPT_REGISTER_CLAIM_FILE_HOOK:
1002 TVU(register_claim_file) = register_claim_file;
1003 break;
1004 case LDPT_REGISTER_ALL_SYMBOLS_READ_HOOK:
1005 TVU(register_all_symbols_read) = register_all_symbols_read;
1006 break;
1007 case LDPT_REGISTER_CLEANUP_HOOK:
1008 TVU(register_cleanup) = register_cleanup;
1009 break;
1010 case LDPT_ADD_SYMBOLS:
1011 TVU(add_symbols) = add_symbols;
1012 break;
1013 case LDPT_GET_INPUT_FILE:
1014 TVU(get_input_file) = get_input_file;
1015 break;
15f7a26b
L
1016 case LDPT_GET_VIEW:
1017 TVU(get_view) = get_view;
1018 break;
f84854b6
L
1019 case LDPT_RELEASE_INPUT_FILE:
1020 TVU(release_input_file) = release_input_file;
1021 break;
1022 case LDPT_GET_SYMBOLS:
69ee6ab2
AM
1023 TVU(get_symbols) = get_symbols_v1;
1024 break;
1025 case LDPT_GET_SYMBOLS_V2:
1026 TVU(get_symbols) = get_symbols_v2;
f84854b6
L
1027 break;
1028 case LDPT_ADD_INPUT_FILE:
1029 TVU(add_input_file) = add_input_file;
1030 break;
1031 case LDPT_ADD_INPUT_LIBRARY:
1032 TVU(add_input_library) = add_input_library;
1033 break;
1034 case LDPT_SET_EXTRA_LIBRARY_PATH:
1035 TVU(set_extra_library_path) = set_extra_library_path;
1036 break;
1037 default:
1038 /* Added a new entry to the array without adding
1039 a new case to set up its value is a bug. */
1040 FAIL ();
5d3236ee
DK
1041 }
1042#undef TVU
1043 }
5d3236ee
DK
1044}
1045
1046/* Append the per-plugin args list and trailing LDPT_NULL to tv. */
1047static void
1048set_tv_plugin_args (plugin_t *plugin, struct ld_plugin_tv *tv)
1049{
1050 plugin_arg_t *arg = plugin->args;
1051 while (arg)
1052 {
1053 tv->tv_tag = LDPT_OPTION;
1054 tv->tv_u.tv_string = arg->arg;
1055 arg = arg->next;
1056 tv++;
1057 }
1058 tv->tv_tag = LDPT_NULL;
1059 tv->tv_u.tv_val = 0;
1060}
1061
1062/* Load up and initialise all plugins after argument parsing. */
d82184d7 1063void
d44ad554 1064plugin_load_plugins (void)
5d3236ee
DK
1065{
1066 struct ld_plugin_tv *my_tv;
1067 unsigned int max_args = 0;
1068 plugin_t *curplug = plugins_list;
1069
1070 /* If there are no plugins, we need do nothing this run. */
1071 if (!curplug)
d82184d7 1072 return;
5d3236ee
DK
1073
1074 /* First pass over plugins to find max # args needed so that we
1075 can size and allocate the tv array. */
1076 while (curplug)
1077 {
1078 if (curplug->n_args > max_args)
1079 max_args = curplug->n_args;
1080 curplug = curplug->next;
1081 }
1082
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);
1086
1087 /* Pass over plugins again, activating them. */
1088 curplug = plugins_list;
1089 while (curplug)
1090 {
1091 enum ld_plugin_status rv;
a8f9d13e
AM
1092 ld_plugin_onload onloadfn;
1093
1094 onloadfn = (ld_plugin_onload) dlsym (curplug->dlhandle, "onload");
5d3236ee 1095 if (!onloadfn)
a8f9d13e 1096 onloadfn = (ld_plugin_onload) dlsym (curplug->dlhandle, "_onload");
5d3236ee 1097 if (!onloadfn)
df5f2391 1098 einfo (_("%F%P: %s: error loading plugin: %s\n"),
d82184d7 1099 curplug->name, dlerror ());
5d3236ee
DK
1100 set_tv_plugin_args (curplug, &my_tv[tv_header_size]);
1101 called_plugin = curplug;
1102 rv = (*onloadfn) (my_tv);
1103 called_plugin = NULL;
1104 if (rv != LDPS_OK)
df5f2391 1105 einfo (_("%F%P: %s: plugin error: %d\n"), curplug->name, rv);
5d3236ee
DK
1106 curplug = curplug->next;
1107 }
1108
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. */
9e2278f5
AM
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;
5d3236ee 1116 link_info.notice_all = TRUE;
61f41c3c 1117 link_info.lto_plugin_active = TRUE;
9e2278f5 1118 link_info.callbacks = &plugin_callbacks;
38604796 1119
5ae0078c
L
1120 register_ld_plugin_object_p (plugin_object_p);
1121
38604796 1122#if HAVE_MMAP && HAVE_GETPAGESIZE
fd5a1509 1123 plugin_pagesize = getpagesize ();
38604796 1124#endif
5d3236ee
DK
1125}
1126
1127/* Call 'claim file' hook for all plugins. */
02d00247 1128static int
5d3236ee
DK
1129plugin_call_claim_file (const struct ld_plugin_input_file *file, int *claimed)
1130{
1131 plugin_t *curplug = plugins_list;
1132 *claimed = FALSE;
5d3236ee
DK
1133 while (curplug && !*claimed)
1134 {
1135 if (curplug->claim_file_handler)
1136 {
1137 enum ld_plugin_status rv;
ace667e5 1138
5d3236ee
DK
1139 called_plugin = curplug;
1140 rv = (*curplug->claim_file_handler) (file, claimed);
1141 called_plugin = NULL;
1142 if (rv != LDPS_OK)
1143 set_plugin_error (curplug->name);
1144 }
1145 curplug = curplug->next;
1146 }
1147 return plugin_error_p () ? -1 : 0;
1148}
1149
35a1e5f3
L
1150/* Duplicates a character string with memory attached to ABFD. */
1151
1152static char *
1153plugin_strdup (bfd *abfd, const char *str)
1154{
1155 size_t strlength;
1156 char *copy;
1157 strlength = strlen (str) + 1;
1158 copy = bfd_alloc (abfd, strlength);
1159 if (copy == NULL)
df5f2391 1160 einfo (_("%F%P: plugin_strdup failed to allocate memory: %s\n"),
35a1e5f3
L
1161 bfd_get_error ());
1162 memcpy (copy, str, strlength);
1163 return copy;
1164}
1165
5ae0078c
L
1166static const bfd_target *
1167plugin_object_p (bfd *ibfd)
02d00247 1168{
5ae0078c 1169 int claimed;
f4b78d18 1170 plugin_input_file_t *input;
35a1e5f3
L
1171 struct ld_plugin_input_file file;
1172 bfd *abfd;
5ae0078c
L
1173
1174 /* Don't try the dummy object file. */
1175 if ((ibfd->flags & BFD_PLUGIN) != 0)
1176 return NULL;
1177
49f30d83 1178 if (ibfd->plugin_format != bfd_plugin_unknown)
5ae0078c
L
1179 {
1180 if (ibfd->plugin_format == bfd_plugin_yes)
1181 return ibfd->plugin_dummy_bfd->xvec;
1182 else
1183 return NULL;
1184 }
1185
02d00247
AM
1186 /* We create a dummy BFD, initially empty, to house whatever symbols
1187 the plugin may want to add. */
35a1e5f3 1188 abfd = plugin_get_ir_dummy_bfd (ibfd->filename, ibfd);
f4b78d18
L
1189
1190 input = bfd_alloc (abfd, sizeof (*input));
1191 if (input == NULL)
df5f2391 1192 einfo (_("%F%P: plugin failed to allocate memory for input: %s\n"),
f4b78d18
L
1193 bfd_get_error ());
1194
7d0b9ebc
AM
1195 if (!bfd_plugin_open_input (ibfd, &file))
1196 return NULL;
35a1e5f3 1197
7d0b9ebc
AM
1198 if (file.name == ibfd->filename)
1199 {
35a1e5f3
L
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. */
7d0b9ebc 1202 file.name = plugin_strdup (abfd, file.name);
35a1e5f3
L
1203 }
1204
35a1e5f3 1205 file.handle = input;
f4b78d18 1206 input->abfd = abfd;
2aec968d
L
1207 input->view_buffer.addr = NULL;
1208 input->view_buffer.filesize = 0;
1209 input->view_buffer.offset = 0;
7d0b9ebc 1210 input->fd = file.fd;
d319a098 1211 input->use_mmap = FALSE;
7d0b9ebc
AM
1212 input->offset = file.offset;
1213 input->filesize = file.filesize;
35a1e5f3 1214 input->name = plugin_strdup (abfd, ibfd->filename);
f4b78d18 1215
5ae0078c
L
1216 claimed = 0;
1217
35a1e5f3 1218 if (plugin_call_claim_file (&file, &claimed))
df5f2391 1219 einfo (_("%F%P: %s: plugin reported error claiming file\n"),
02d00247 1220 plugin_error_plugin ());
f4b78d18 1221
7d0b9ebc 1222 if (input->fd != -1 && !bfd_plugin_target_p (ibfd->xvec))
f4b78d18 1223 {
5ae0078c
L
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. */
7d0b9ebc 1232 close (input->fd);
f4b78d18
L
1233 input->fd = -1;
1234 }
1235
02d00247
AM
1236 if (claimed)
1237 {
5ae0078c
L
1238 ibfd->plugin_format = bfd_plugin_yes;
1239 ibfd->plugin_dummy_bfd = abfd;
35a1e5f3 1240 bfd_make_readable (abfd);
5ae0078c 1241 return abfd->xvec;
02d00247
AM
1242 }
1243 else
1244 {
38604796
L
1245#if HAVE_MMAP
1246 if (input->use_mmap)
1247 {
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;
1253 size += bias;
1254 addr -= bias;
1255# endif
1256 munmap (addr, size);
1257 }
1258#endif
1259
02d00247
AM
1260 /* If plugin didn't claim the file, we don't need the dummy bfd.
1261 Can't avoid speculatively creating it, alas. */
5ae0078c 1262 ibfd->plugin_format = bfd_plugin_no;
f4b78d18 1263 bfd_close_all_done (abfd);
5ae0078c
L
1264 return NULL;
1265 }
1266}
1267
1268void
1269plugin_maybe_claim (lang_input_statement_type *entry)
1270{
fb47deda 1271 ASSERT (entry->header.type == lang_input_statement_enum);
5ae0078c
L
1272 if (plugin_object_p (entry->the_bfd))
1273 {
1274 bfd *abfd = entry->the_bfd->plugin_dummy_bfd;
1275
1276 /* Discard the real file's BFD and substitute the dummy one. */
1277
b0cffb47
AM
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. */
5ae0078c
L
1282 if (entry->the_bfd->my_archive == NULL)
1283 bfd_close (entry->the_bfd);
1284 entry->the_bfd = abfd;
1285 entry->flags.claimed = 1;
02d00247
AM
1286 }
1287}
1288
5d3236ee
DK
1289/* Call 'all symbols read' hook for all plugins. */
1290int
1291plugin_call_all_symbols_read (void)
1292{
1293 plugin_t *curplug = plugins_list;
1294
1295 /* Disable any further file-claiming. */
1296 no_more_claiming = TRUE;
1297
5d3236ee
DK
1298 while (curplug)
1299 {
1300 if (curplug->all_symbols_read_handler)
1301 {
1302 enum ld_plugin_status rv;
1303 called_plugin = curplug;
1304 rv = (*curplug->all_symbols_read_handler) ();
1305 called_plugin = NULL;
1306 if (rv != LDPS_OK)
1307 set_plugin_error (curplug->name);
1308 }
1309 curplug = curplug->next;
1310 }
1311 return plugin_error_p () ? -1 : 0;
1312}
1313
e73d965c 1314/* Call 'cleanup' hook for all plugins at exit. */
498cd2a0 1315void
5d3236ee
DK
1316plugin_call_cleanup (void)
1317{
1318 plugin_t *curplug = plugins_list;
1319 while (curplug)
1320 {
1321 if (curplug->cleanup_handler && !curplug->cleanup_done)
1322 {
1323 enum ld_plugin_status rv;
1324 curplug->cleanup_done = TRUE;
1325 called_plugin = curplug;
1326 rv = (*curplug->cleanup_handler) ();
1327 called_plugin = NULL;
1328 if (rv != LDPS_OK)
d82184d7
L
1329 info_msg (_("%P: %s: error in plugin cleanup: %d (ignored)\n"),
1330 curplug->name, rv);
5d3236ee
DK
1331 dlclose (curplug->dlhandle);
1332 }
1333 curplug = curplug->next;
1334 }
5d3236ee
DK
1335}
1336
5d3236ee
DK
1337/* To determine which symbols should be resolved LDPR_PREVAILING_DEF
1338 and which LDPR_PREVAILING_DEF_IRONLY, we notice all the symbols as
35ed3f94 1339 the linker adds them to the linker hash table. Mark those
bc4e12de 1340 referenced from a non-IR file with non_ir_ref_regular or
4070765b
AM
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. */
9e2278f5
AM
1344static bfd_boolean
1345plugin_notice (struct bfd_link_info *info,
35ed3f94 1346 struct bfd_link_hash_entry *h,
46135103 1347 struct bfd_link_hash_entry *inh,
9e2278f5
AM
1348 bfd *abfd,
1349 asection *section,
16d96b5b 1350 bfd_vma value,
46135103 1351 flagword flags)
5d3236ee 1352{
46135103
AM
1353 struct bfd_link_hash_entry *orig_h = h;
1354
35ed3f94 1355 if (h != NULL)
5d3236ee 1356 {
cd6eee13 1357 bfd *sym_bfd;
4070765b 1358 bfd_boolean ref = FALSE;
cd6eee13 1359
46135103
AM
1360 if (h->type == bfd_link_hash_warning)
1361 h = h->u.i.link;
1362
4a2b04a7 1363 /* Nothing to do here if this def/ref is from an IR dummy BFD. */
9e2278f5 1364 if (is_ir_dummy_bfd (abfd))
4a2b04a7 1365 ;
9e2278f5 1366
16d96b5b
AM
1367 /* Making an indirect symbol counts as a reference unless this
1368 is a brand new symbol. */
4a2b04a7
L
1369 else if (bfd_is_ind_section (section)
1370 || (flags & BSF_INDIRECT) != 0)
16d96b5b 1371 {
46135103
AM
1372 /* ??? Some of this is questionable. See comments in
1373 _bfd_generic_link_add_one_symbol for case IND. */
4070765b
AM
1374 if (h->type != bfd_link_hash_new
1375 || inh->type == bfd_link_hash_new)
16d96b5b 1376 {
4070765b 1377 if ((abfd->flags & DYNAMIC) == 0)
bc4e12de 1378 inh->non_ir_ref_regular = TRUE;
4070765b
AM
1379 else
1380 inh->non_ir_ref_dynamic = TRUE;
16d96b5b 1381 }
4070765b
AM
1382
1383 if (h->type != bfd_link_hash_new)
1384 ref = TRUE;
16d96b5b
AM
1385 }
1386
1387 /* Nothing to do here for warning symbols. */
1388 else if ((flags & BSF_WARNING) != 0)
1389 ;
1390
1391 /* Nothing to do here for constructor symbols. */
1392 else if ((flags & BSF_CONSTRUCTOR) != 0)
1393 ;
1394
35ed3f94 1395 /* If this is a ref, set non_ir_ref. */
16d96b5b 1396 else if (bfd_is_und_section (section))
3d5bef4c
L
1397 {
1398 /* Replace the undefined dummy bfd with the real one. */
4070765b
AM
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))
59fa66c5 1403 h->u.undef.abfd = abfd;
4070765b 1404 ref = TRUE;
3d5bef4c 1405 }
35ed3f94 1406
af4fa23f
AM
1407
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))
cd6eee13 1413 {
af4fa23f
AM
1414 if (h->type == bfd_link_hash_common
1415 && is_ir_dummy_bfd (sym_bfd = h->u.c.p->section->owner))
0616a280
AM
1416 {
1417 h->type = bfd_link_hash_undefweak;
1418 h->u.undef.abfd = sym_bfd;
1419 }
af4fa23f
AM
1420 ref = TRUE;
1421 }
4070765b 1422
af4fa23f
AM
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)))
1434 {
1435 h->type = bfd_link_hash_undefweak;
1436 h->u.undef.abfd = sym_bfd;
4070765b
AM
1437 }
1438
1439 if (ref)
1440 {
1441 if ((abfd->flags & DYNAMIC) == 0)
bc4e12de 1442 h->non_ir_ref_regular = TRUE;
4070765b
AM
1443 else
1444 h->non_ir_ref_dynamic = TRUE;
cd6eee13 1445 }
5d3236ee
DK
1446 }
1447
1448 /* Continue with cref/nocrossref/trace-sym processing. */
46135103 1449 if (orig_h == NULL
9e2278f5
AM
1450 || orig_notice_all
1451 || (info->notice_hash != NULL
46135103 1452 && bfd_hash_lookup (info->notice_hash, orig_h->root.string,
35ed3f94 1453 FALSE, FALSE) != NULL))
46135103
AM
1454 return (*orig_callbacks->notice) (info, orig_h, inh,
1455 abfd, section, value, flags);
5d3236ee
DK
1456 return TRUE;
1457}
This page took 0.510959 seconds and 4 git commands to generate.