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