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