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