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