1 /* Main program of GNU linker.
2    Copyright (C) 1991-2024 Free Software Foundation, Inc.
3    Written by Steve Chamberlain steve@cygnus.com
4 
5    This file is part of the GNU Binutils.
6 
7    This program is free software; you can redistribute it and/or modify
8    it under the terms of the GNU General Public License as published by
9    the Free Software Foundation; either version 3 of the License, or
10    (at your option) any later version.
11 
12    This program is distributed in the hope that it will be useful,
13    but WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15    GNU General Public License for more details.
16 
17    You should have received a copy of the GNU General Public License
18    along with this program; if not, write to the Free Software
19    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
20    MA 02110-1301, USA.  */
21 
22 #include "sysdep.h"
23 #include "bfd.h"
24 #include "safe-ctype.h"
25 #include "libiberty.h"
26 #include "bfdlink.h"
27 #include "ctf-api.h"
28 #include "filenames.h"
29 #include "elf/common.h"
30 
31 #include "ld.h"
32 #include "ldmain.h"
33 #include "ldmisc.h"
34 #include "ldwrite.h"
35 #include "ldexp.h"
36 #include "ldlang.h"
37 #include <ldgram.h>
38 #include "ldlex.h"
39 #include "ldfile.h"
40 #include "ldemul.h"
41 #include "ldctor.h"
42 #if BFD_SUPPORTS_PLUGINS
43 #include "plugin.h"
44 #include "plugin-api.h"
45 #endif /* BFD_SUPPORTS_PLUGINS */
46 
47 /* Somewhere above, sys/stat.h got included.  */
48 #if !defined(S_ISDIR) && defined(S_IFDIR)
49 #define   S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR)
50 #endif
51 
52 #include <string.h>
53 
54 #ifndef TARGET_SYSTEM_ROOT
55 #define TARGET_SYSTEM_ROOT ""
56 #endif
57 
58 /* EXPORTS */
59 
60 FILE *saved_script_handle = NULL;
61 FILE *previous_script_handle = NULL;
62 bool force_make_executable = false;
63 
64 char *default_target;
65 const char *output_filename = "a.out";
66 
67 /* Name this program was invoked by.  */
68 char *program_name;
69 
70 /* The prefix for system library directories.  */
71 const char *ld_sysroot;
72 
73 /* The canonical representation of ld_sysroot.  */
74 char *ld_canon_sysroot;
75 int ld_canon_sysroot_len;
76 
77 /* Set by -G argument, for targets like MIPS ELF.  */
78 int g_switch_value = 8;
79 
80 /* Nonzero means print names of input files as processed.  */
81 unsigned int trace_files;
82 
83 /* Nonzero means report actions taken by the linker, and describe the linker script in use.  */
84 bool verbose;
85 
86 /* Nonzero means version number was printed, so exit successfully
87    instead of complaining if no input files are given.  */
88 bool version_printed;
89 
90 /* TRUE if we should demangle symbol names.  */
91 bool demangling;
92 
93 args_type command_line;
94 
95 ld_config_type config;
96 
97 sort_type sort_section;
98 
99 static const char *get_sysroot
100   (int, char **);
101 static char *get_emulation
102   (int, char **);
103 static bool add_archive_element
104   (struct bfd_link_info *, bfd *, const char *, bfd **);
105 static void multiple_definition
106   (struct bfd_link_info *, struct bfd_link_hash_entry *,
107    bfd *, asection *, bfd_vma);
108 static void multiple_common
109   (struct bfd_link_info *, struct bfd_link_hash_entry *,
110    bfd *, enum bfd_link_hash_type, bfd_vma);
111 static void add_to_set
112   (struct bfd_link_info *, struct bfd_link_hash_entry *,
113    bfd_reloc_code_real_type, bfd *, asection *, bfd_vma);
114 static void constructor_callback
115   (struct bfd_link_info *, bool, const char *, bfd *,
116    asection *, bfd_vma);
117 static void warning_callback
118   (struct bfd_link_info *, const char *, const char *, bfd *,
119    asection *, bfd_vma);
120 static void warning_find_reloc
121   (bfd *, asection *, void *);
122 static void undefined_symbol
123   (struct bfd_link_info *, const char *, bfd *, asection *, bfd_vma,
124    bool);
125 static void reloc_overflow
126   (struct bfd_link_info *, struct bfd_link_hash_entry *, const char *,
127    const char *, bfd_vma, bfd *, asection *, bfd_vma);
128 static void reloc_dangerous
129   (struct bfd_link_info *, const char *, bfd *, asection *, bfd_vma);
130 static void unattached_reloc
131   (struct bfd_link_info *, const char *, bfd *, asection *, bfd_vma);
132 static bool notice
133   (struct bfd_link_info *, struct bfd_link_hash_entry *,
134    struct bfd_link_hash_entry *, bfd *, asection *, bfd_vma, flagword);
135 
136 static struct bfd_link_callbacks link_callbacks =
137 {
138   add_archive_element,
139   multiple_definition,
140   multiple_common,
141   add_to_set,
142   constructor_callback,
143   warning_callback,
144   undefined_symbol,
145   reloc_overflow,
146   reloc_dangerous,
147   unattached_reloc,
148   notice,
149   einfo,
150   info_msg,
151   minfo,
152   ldlang_override_segment_assignment,
153   ldlang_ctf_acquire_strings,
154   NULL,
155   ldlang_ctf_new_dynsym,
156   ldlang_write_ctf_late
157 };
158 
159 static bfd_assert_handler_type default_bfd_assert_handler;
160 static bfd_error_handler_type default_bfd_error_handler;
161 
162 struct bfd_link_info link_info;
163 
164 struct dependency_file
165 {
166   struct dependency_file *next;
167   char *name;
168 };
169 
170 static struct dependency_file *dependency_files, *dependency_files_tail;
171 
172 void
track_dependency_files(const char * filename)173 track_dependency_files (const char *filename)
174 {
175   struct dependency_file *dep
176     = (struct dependency_file *) xmalloc (sizeof (*dep));
177   dep->name = xstrdup (filename);
178   dep->next = NULL;
179   if (dependency_files == NULL)
180     dependency_files = dep;
181   else
182     dependency_files_tail->next = dep;
183   dependency_files_tail = dep;
184 }
185 
186 static void
write_dependency_file(void)187 write_dependency_file (void)
188 {
189   FILE *out;
190   struct dependency_file *dep;
191 
192   out = fopen (config.dependency_file, FOPEN_WT);
193   if (out == NULL)
194     {
195       einfo (_("%F%P: cannot open dependency file %s: %E\n"),
196                config.dependency_file);
197     }
198 
199   fprintf (out, "%s:", output_filename);
200 
201   for (dep = dependency_files; dep != NULL; dep = dep->next)
202     fprintf (out, " \\\n  %s", dep->name);
203 
204   fprintf (out, "\n");
205   for (dep = dependency_files; dep != NULL; dep = dep->next)
206     fprintf (out, "\n%s:\n", dep->name);
207 
208   fclose (out);
209 }
210 
211 static void
ld_cleanup(void)212 ld_cleanup (void)
213 {
214   bfd *ibfd, *inext;
215   if (link_info.output_bfd)
216     bfd_close_all_done (link_info.output_bfd);
217   for (ibfd = link_info.input_bfds; ibfd; ibfd = inext)
218     {
219       inext = ibfd->link.next;
220       bfd_close_all_done (ibfd);
221     }
222 #if BFD_SUPPORTS_PLUGINS
223   plugin_call_cleanup ();
224 #endif
225   if (output_filename && delete_output_file_on_failure)
226     unlink_if_ordinary (output_filename);
227 }
228 
229 /* Hook to notice BFD assertions.  */
230 
231 static void
ld_bfd_assert_handler(const char * fmt,const char * bfdver,const char * file,int line)232 ld_bfd_assert_handler (const char *fmt, const char *bfdver,
233                            const char *file, int line)
234 {
235   config.make_executable = false;
236   (*default_bfd_assert_handler) (fmt, bfdver, file, line);
237 }
238 
239 /* Hook the bfd error/warning handler for --fatal-warnings.  */
240 
241 static void
ld_bfd_error_handler(const char * fmt,va_list ap)242 ld_bfd_error_handler (const char *fmt, va_list ap)
243 {
244   if (config.fatal_warnings)
245     config.make_executable = false;
246   (*default_bfd_error_handler) (fmt, ap);
247 }
248 
249 int
main(int argc,char ** argv)250 main (int argc, char **argv)
251 {
252   char *emulation;
253   long start_time = get_run_time ();
254 
255 #ifdef HAVE_LC_MESSAGES
256   setlocale (LC_MESSAGES, "");
257 #endif
258   setlocale (LC_CTYPE, "");
259   bindtextdomain (PACKAGE, LOCALEDIR);
260   textdomain (PACKAGE);
261 
262   program_name = argv[0];
263   xmalloc_set_program_name (program_name);
264 
265   expandargv (&argc, &argv);
266 
267   if (bfd_init () != BFD_INIT_MAGIC)
268     einfo (_("%F%P: fatal error: libbfd ABI mismatch\n"));
269 
270   bfd_set_error_program_name (program_name);
271 
272   /* We want to notice and fail on those nasty BFD assertions which are
273      likely to signal incorrect output being generated but otherwise may
274      leave no trace.  */
275   default_bfd_assert_handler = bfd_set_assert_handler (ld_bfd_assert_handler);
276 
277   /* Also hook the bfd error/warning handler for --fatal-warnings.  */
278   default_bfd_error_handler = bfd_set_error_handler (ld_bfd_error_handler);
279 
280   xatexit (ld_cleanup);
281 
282   /* Set up the sysroot directory.  */
283   ld_sysroot = get_sysroot (argc, argv);
284   if (*ld_sysroot)
285     ld_canon_sysroot = lrealpath (ld_sysroot);
286   if (ld_canon_sysroot)
287     {
288       ld_canon_sysroot_len = strlen (ld_canon_sysroot);
289 
290       /* is_sysrooted_pathname() relies on no trailing dirsep.  */
291       if (ld_canon_sysroot_len > 0
292             && IS_DIR_SEPARATOR (ld_canon_sysroot [ld_canon_sysroot_len - 1]))
293           ld_canon_sysroot [--ld_canon_sysroot_len] = '\0';
294     }
295   else
296     ld_canon_sysroot_len = -1;
297 
298   /* Set the default BFD target based on the configured target.  Doing
299      this permits the linker to be configured for a particular target,
300      and linked against a shared BFD library which was configured for
301      a different target.  The macro TARGET is defined by Makefile.  */
302   if (!bfd_set_default_target (TARGET))
303     {
304       einfo (_("%X%P: can't set BFD default target to `%s': %E\n"), TARGET);
305       xexit (1);
306     }
307 
308 #if YYDEBUG
309   {
310     extern int yydebug;
311     yydebug = 1;
312   }
313 #endif
314 
315   config.build_constructors = true;
316   config.rpath_separator = ':';
317   config.split_by_reloc = (unsigned) -1;
318   config.split_by_file = (bfd_size_type) -1;
319   config.make_executable = true;
320   config.magic_demand_paged = true;
321   config.text_read_only = true;
322   config.print_map_discarded = true;
323   link_info.disable_target_specific_optimizations = -1;
324 
325   command_line.warn_mismatch = true;
326   command_line.warn_search_mismatch = true;
327   command_line.check_section_addresses = -1;
328 
329   /* We initialize DEMANGLING based on the environment variable
330      COLLECT_NO_DEMANGLE.  The gcc collect2 program will demangle the
331      output of the linker, unless COLLECT_NO_DEMANGLE is set in the
332      environment.  Acting the same way here lets us provide the same
333      interface by default.  */
334   demangling = getenv ("COLLECT_NO_DEMANGLE") == NULL;
335 
336   link_info.allow_undefined_version = true;
337   link_info.keep_memory = true;
338   link_info.max_cache_size = (bfd_size_type) -1;
339   link_info.combreloc = true;
340   link_info.strip_discarded = true;
341   link_info.prohibit_multiple_definition_absolute = false;
342   link_info.textrel_check = DEFAULT_LD_TEXTREL_CHECK;
343   link_info.emit_hash = DEFAULT_EMIT_SYSV_HASH;
344   link_info.emit_gnu_hash = DEFAULT_EMIT_GNU_HASH;
345   link_info.callbacks = &link_callbacks;
346   link_info.input_bfds_tail = &link_info.input_bfds;
347   /* SVR4 linkers seem to set DT_INIT and DT_FINI based on magic _init
348      and _fini symbols.  We are compatible.  */
349   link_info.init_function = "_init";
350   link_info.fini_function = "_fini";
351   link_info.relax_pass = 1;
352   link_info.extern_protected_data = -1;
353   link_info.dynamic_undefined_weak = -1;
354   link_info.indirect_extern_access = -1;
355   link_info.pei386_auto_import = -1;
356   link_info.spare_dynamic_tags = 5;
357   link_info.path_separator = ':';
358 #ifdef DEFAULT_FLAG_COMPRESS_DEBUG
359   config.compress_debug = DEFAULT_COMPRESSED_DEBUG_ALGORITHM;
360 #endif
361 #ifdef DEFAULT_NEW_DTAGS
362   link_info.new_dtags = DEFAULT_NEW_DTAGS;
363 #endif
364   link_info.start_stop_gc = false;
365   link_info.start_stop_visibility = STV_PROTECTED;
366 
367   ldfile_add_arch ("");
368   emulation = get_emulation (argc, argv);
369   ldemul_choose_mode (emulation);
370   default_target = ldemul_choose_target (argc, argv);
371   lang_init ();
372   ldexp_init ();
373   ldemul_before_parse ();
374   lang_has_input_file = false;
375   parse_args (argc, argv);
376 
377   if (config.hash_table_size != 0)
378     bfd_hash_set_default_size (config.hash_table_size);
379 
380 #if BFD_SUPPORTS_PLUGINS
381   /* Now all the plugin arguments have been gathered, we can load them.  */
382   plugin_load_plugins ();
383 #endif /* BFD_SUPPORTS_PLUGINS */
384 
385   ldemul_set_symbols ();
386 
387   /* If we have not already opened and parsed a linker script,
388      try the default script from command line first.  */
389   if (saved_script_handle == NULL
390       && command_line.default_script != NULL)
391     {
392       ldfile_open_script_file (command_line.default_script);
393       parser_input = input_script;
394       yyparse ();
395     }
396 
397   /* If we have not already opened and parsed a linker script
398      read the emulation's appropriate default script.  */
399   if (saved_script_handle == NULL)
400     {
401       int isfile;
402       char *s = ldemul_get_script (&isfile);
403 
404       if (isfile)
405           ldfile_open_default_command_file (s);
406       else
407           {
408             lex_string = s;
409             lex_redirect (s, _("built in linker script"), 1);
410           }
411       parser_input = input_script;
412       yyparse ();
413       lex_string = NULL;
414     }
415 
416   if (verbose)
417     {
418       if (saved_script_handle)
419           info_msg (_("using external linker script:"));
420       else
421           info_msg (_("using internal linker script:"));
422       info_msg ("\n==================================================\n");
423 
424       if (saved_script_handle)
425           {
426             static const int ld_bufsz = 8193;
427             size_t n;
428             char *buf = (char *) xmalloc (ld_bufsz);
429 
430             rewind (saved_script_handle);
431             while ((n = fread (buf, 1, ld_bufsz - 1, saved_script_handle)) > 0)
432               {
433                 buf[n] = 0;
434                 info_msg ("%s", buf);
435               }
436             rewind (saved_script_handle);
437             free (buf);
438           }
439       else
440           {
441             int isfile;
442 
443             info_msg (ldemul_get_script (&isfile));
444           }
445 
446       info_msg ("\n==================================================\n");
447     }
448 
449   if (command_line.force_group_allocation
450       || !bfd_link_relocatable (&link_info))
451     link_info.resolve_section_groups = true;
452   else
453     link_info.resolve_section_groups = false;
454 
455   if (command_line.print_output_format)
456     info_msg ("%s\n", lang_get_output_target ());
457 
458   lang_final ();
459 
460   /* If the only command line argument has been -v or --version or --verbose
461      then ignore any input files provided by linker scripts and exit now.
462      We do not want to create an output file when the linker is just invoked
463      to provide version information.  */
464   if (argc == 2 && version_printed)
465     xexit (0);
466 
467   if (link_info.inhibit_common_definition && !bfd_link_dll (&link_info))
468     einfo (_("%F%P: --no-define-common may not be used without -shared\n"));
469 
470   if (!lang_has_input_file)
471     {
472       if (version_printed || command_line.print_output_format)
473           xexit (0);
474       einfo (_("%F%P: no input files\n"));
475     }
476 
477   if (verbose)
478     info_msg (_("%P: mode %s\n"), emulation);
479 
480   ldemul_after_parse ();
481 
482   if (config.map_filename)
483     {
484       if (strcmp (config.map_filename, "-") == 0)
485           {
486             config.map_file = stdout;
487           }
488       else
489           {
490             config.map_file = fopen (config.map_filename, FOPEN_WT);
491             if (config.map_file == (FILE *) NULL)
492               {
493                 bfd_set_error (bfd_error_system_call);
494                 einfo (_("%F%P: cannot open map file %s: %E\n"),
495                          config.map_filename);
496               }
497           }
498       link_info.has_map_file = true;
499     }
500 
501   lang_process ();
502 
503   /* Print error messages for any missing symbols, for any warning
504      symbols, and possibly multiple definitions.  */
505   if (bfd_link_relocatable (&link_info))
506     link_info.output_bfd->flags &= ~EXEC_P;
507   else
508     link_info.output_bfd->flags |= EXEC_P;
509 
510   flagword flags = 0;
511   switch (config.compress_debug)
512     {
513     case COMPRESS_DEBUG_GNU_ZLIB:
514       flags = BFD_COMPRESS;
515       break;
516     case COMPRESS_DEBUG_GABI_ZLIB:
517       flags = BFD_COMPRESS | BFD_COMPRESS_GABI;
518       break;
519     case COMPRESS_DEBUG_ZSTD:
520       flags = BFD_COMPRESS | BFD_COMPRESS_GABI | BFD_COMPRESS_ZSTD;
521       break;
522     default:
523       break;
524     }
525   link_info.output_bfd->flags
526     |= flags & bfd_applicable_file_flags (link_info.output_bfd);
527 
528   ldwrite ();
529 
530   if (config.map_file != NULL)
531     lang_map ();
532   if (command_line.cref)
533     output_cref (config.map_file != NULL ? config.map_file : stdout);
534   if (nocrossref_list != NULL)
535     check_nocrossrefs ();
536   if (command_line.print_memory_usage)
537     lang_print_memory_usage ();
538 #if 0
539   {
540     struct bfd_link_hash_entry *h;
541 
542     h = bfd_link_hash_lookup (link_info.hash, "__image_base__", 0,0,1);
543     fprintf (stderr, "lookup = %p val %lx\n", h, h ? h->u.def.value : 1);
544   }
545 #endif
546   ldexp_finish ();
547   lang_finish ();
548 
549   if (config.dependency_file != NULL)
550     write_dependency_file ();
551 
552   /* Even if we're producing relocatable output, some non-fatal errors should
553      be reported in the exit status.  (What non-fatal errors, if any, do we
554      want to ignore for relocatable output?)  */
555   if (!config.make_executable && !force_make_executable)
556     {
557       if (verbose)
558           einfo (_("%P: link errors found, deleting executable `%s'\n"),
559                  output_filename);
560 
561       /* The file will be removed by ld_cleanup.  */
562       xexit (1);
563     }
564   else
565     {
566       bfd *obfd = link_info.output_bfd;
567       link_info.output_bfd = NULL;
568       if (!bfd_close (obfd))
569           einfo (_("%F%P: %s: final close failed: %E\n"), output_filename);
570 
571       /* If the --force-exe-suffix is enabled, and we're making an
572            executable file and it doesn't end in .exe, copy it to one
573            which does.  */
574       if (!bfd_link_relocatable (&link_info)
575             && command_line.force_exe_suffix)
576           {
577             int len = strlen (output_filename);
578 
579             if (len < 4
580                 || (strcasecmp (output_filename + len - 4, ".exe") != 0
581                       && strcasecmp (output_filename + len - 4, ".dll") != 0))
582               {
583                 FILE *src;
584                 FILE *dst;
585                 const int bsize = 4096;
586                 char *buf = (char *) xmalloc (bsize);
587                 int l;
588                 char *dst_name = (char *) xmalloc (len + 5);
589 
590                 strcpy (dst_name, output_filename);
591                 strcat (dst_name, ".exe");
592                 src = fopen (output_filename, FOPEN_RB);
593                 dst = fopen (dst_name, FOPEN_WB);
594 
595                 if (!src)
596                     einfo (_("%F%P: unable to open for source of copy `%s'\n"),
597                            output_filename);
598                 if (!dst)
599                     einfo (_("%F%P: unable to open for destination of copy `%s'\n"),
600                            dst_name);
601                 while ((l = fread (buf, 1, bsize, src)) > 0)
602                     {
603                       int done = fwrite (buf, 1, l, dst);
604 
605                       if (done != l)
606                         einfo (_("%P: error writing file `%s'\n"), dst_name);
607                     }
608 
609                 fclose (src);
610                 if (fclose (dst) == EOF)
611                     einfo (_("%P: error closing file `%s'\n"), dst_name);
612                 free (dst_name);
613                 free (buf);
614               }
615           }
616     }
617 
618   if (config.stats)
619     {
620       long run_time = get_run_time () - start_time;
621 
622       fflush (stdout);
623       fprintf (stderr, _("%s: total time in link: %ld.%06ld\n"),
624                  program_name, run_time / 1000000, run_time % 1000000);
625       fflush (stderr);
626     }
627 
628   /* Prevent ld_cleanup from deleting the output file.  */
629   output_filename = NULL;
630 
631   xexit (0);
632   return 0;
633 }
634 
635 /* If the configured sysroot is relocatable, try relocating it based on
636    default prefix FROM.  Return the relocated directory if it exists,
637    otherwise return null.  */
638 
639 static char *
get_relative_sysroot(const char * from ATTRIBUTE_UNUSED)640 get_relative_sysroot (const char *from ATTRIBUTE_UNUSED)
641 {
642 #ifdef TARGET_SYSTEM_ROOT_RELOCATABLE
643   char *path;
644   struct stat s;
645 
646   path = make_relative_prefix (program_name, from, TARGET_SYSTEM_ROOT);
647   if (path)
648     {
649       if (stat (path, &s) == 0 && S_ISDIR (s.st_mode))
650           return path;
651       free (path);
652     }
653 #endif
654   return 0;
655 }
656 
657 /* Return the sysroot directory.  Return "" if no sysroot is being used.  */
658 
659 static const char *
get_sysroot(int argc,char ** argv)660 get_sysroot (int argc, char **argv)
661 {
662   int i;
663   const char *path = NULL;
664 
665   for (i = 1; i < argc; i++)
666     if (startswith (argv[i], "--sysroot="))
667       path = argv[i] + strlen ("--sysroot=");
668 
669   if (!path)
670     path = get_relative_sysroot (BINDIR);
671 
672   if (!path)
673     path = get_relative_sysroot (TOOLBINDIR);
674 
675   if (!path)
676     path = TARGET_SYSTEM_ROOT;
677 
678   if (IS_DIR_SEPARATOR (*path) && path[1] == 0)
679     path = "";
680 
681   return path;
682 }
683 
684 /* We need to find any explicitly given emulation in order to initialize the
685    state that's needed by the lex&yacc argument parser (parse_args).  */
686 
687 static char *
get_emulation(int argc,char ** argv)688 get_emulation (int argc, char **argv)
689 {
690   char *emulation;
691   int i;
692 
693   emulation = getenv (EMULATION_ENVIRON);
694   if (emulation == NULL)
695     emulation = DEFAULT_EMULATION;
696 
697   for (i = 1; i < argc; i++)
698     {
699       if (startswith (argv[i], "-m"))
700           {
701             if (argv[i][2] == '\0')
702               {
703                 /* -m EMUL */
704                 if (i < argc - 1)
705                     {
706                       emulation = argv[i + 1];
707                       i++;
708                     }
709                 else
710                     einfo (_("%F%P: missing argument to -m\n"));
711               }
712             else if (strcmp (argv[i], "-mips1") == 0
713                        || strcmp (argv[i], "-mips2") == 0
714                        || strcmp (argv[i], "-mips3") == 0
715                        || strcmp (argv[i], "-mips4") == 0
716                        || strcmp (argv[i], "-mips5") == 0
717                        || strcmp (argv[i], "-mips32") == 0
718                        || strcmp (argv[i], "-mips32r2") == 0
719                        || strcmp (argv[i], "-mips32r3") == 0
720                        || strcmp (argv[i], "-mips32r5") == 0
721                        || strcmp (argv[i], "-mips32r6") == 0
722                        || strcmp (argv[i], "-mips64") == 0
723                        || strcmp (argv[i], "-mips64r2") == 0
724                        || strcmp (argv[i], "-mips64r3") == 0
725                        || strcmp (argv[i], "-mips64r5") == 0
726                        || strcmp (argv[i], "-mips64r6") == 0)
727               {
728                 /* FIXME: The arguments -mips1, -mips2, -mips3, etc. are
729                      passed to the linker by some MIPS compilers.  They
730                      generally tell the linker to use a slightly different
731                      library path.  Perhaps someday these should be
732                      implemented as emulations; until then, we just ignore
733                      the arguments and hope that nobody ever creates
734                      emulations named ips1, ips2 or ips3.  */
735               }
736             else if (strcmp (argv[i], "-m486") == 0)
737               {
738                 /* FIXME: The argument -m486 is passed to the linker on
739                      some Linux systems.  Hope that nobody creates an
740                      emulation named 486.  */
741               }
742             else
743               {
744                 /* -mEMUL */
745                 emulation = &argv[i][2];
746               }
747           }
748     }
749 
750   return emulation;
751 }
752 
753 void
add_ysym(const char * name)754 add_ysym (const char *name)
755 {
756   if (link_info.notice_hash == NULL)
757     {
758       link_info.notice_hash
759           = (struct bfd_hash_table *) xmalloc (sizeof (struct bfd_hash_table));
760       if (!bfd_hash_table_init_n (link_info.notice_hash,
761                                           bfd_hash_newfunc,
762                                           sizeof (struct bfd_hash_entry),
763                                           61))
764           einfo (_("%F%P: bfd_hash_table_init failed: %E\n"));
765     }
766 
767   if (bfd_hash_lookup (link_info.notice_hash, name, true, true) == NULL)
768     einfo (_("%F%P: bfd_hash_lookup failed: %E\n"));
769 }
770 
771 void
add_ignoresym(struct bfd_link_info * info,const char * name)772 add_ignoresym (struct bfd_link_info *info, const char *name)
773 {
774   if (info->ignore_hash == NULL)
775     {
776       info->ignore_hash = xmalloc (sizeof (struct bfd_hash_table));
777       if (!bfd_hash_table_init_n (info->ignore_hash,
778                                           bfd_hash_newfunc,
779                                           sizeof (struct bfd_hash_entry),
780                                           61))
781           einfo (_("%F%P: bfd_hash_table_init failed: %E\n"));
782     }
783 
784   if (bfd_hash_lookup (info->ignore_hash, name, true, true) == NULL)
785     einfo (_("%F%P: bfd_hash_lookup failed: %E\n"));
786 }
787 
788 /* Record a symbol to be wrapped, from the --wrap option.  */
789 
790 void
add_wrap(const char * name)791 add_wrap (const char *name)
792 {
793   if (link_info.wrap_hash == NULL)
794     {
795       link_info.wrap_hash
796           = (struct bfd_hash_table *) xmalloc (sizeof (struct bfd_hash_table));
797       if (!bfd_hash_table_init_n (link_info.wrap_hash,
798                                           bfd_hash_newfunc,
799                                           sizeof (struct bfd_hash_entry),
800                                           61))
801           einfo (_("%F%P: bfd_hash_table_init failed: %E\n"));
802     }
803 
804   if (bfd_hash_lookup (link_info.wrap_hash, name, true, true) == NULL)
805     einfo (_("%F%P: bfd_hash_lookup failed: %E\n"));
806 }
807 
808 /* Handle the -retain-symbols-file option.  */
809 
810 void
add_keepsyms_file(const char * filename)811 add_keepsyms_file (const char *filename)
812 {
813   FILE *file;
814   char *buf;
815   size_t bufsize;
816   int c;
817 
818   if (link_info.strip == strip_some)
819     einfo (_("%X%P: error: duplicate retain-symbols-file\n"));
820 
821   file = fopen (filename, "r");
822   if (file == NULL)
823     {
824       bfd_set_error (bfd_error_system_call);
825       einfo ("%X%P: %s: %E\n", filename);
826       return;
827     }
828 
829   link_info.keep_hash = (struct bfd_hash_table *)
830       xmalloc (sizeof (struct bfd_hash_table));
831   if (!bfd_hash_table_init (link_info.keep_hash, bfd_hash_newfunc,
832                                   sizeof (struct bfd_hash_entry)))
833     einfo (_("%F%P: bfd_hash_table_init failed: %E\n"));
834 
835   bufsize = 100;
836   buf = (char *) xmalloc (bufsize);
837 
838   c = getc (file);
839   while (c != EOF)
840     {
841       while (ISSPACE (c))
842           c = getc (file);
843 
844       if (c != EOF)
845           {
846             size_t len = 0;
847 
848             while (!ISSPACE (c) && c != EOF)
849               {
850                 buf[len] = c;
851                 ++len;
852                 if (len >= bufsize)
853                     {
854                       bufsize *= 2;
855                       buf = (char *) xrealloc (buf, bufsize);
856                     }
857                 c = getc (file);
858               }
859 
860             buf[len] = '\0';
861 
862             if (bfd_hash_lookup (link_info.keep_hash, buf, true, true) == NULL)
863               einfo (_("%F%P: bfd_hash_lookup for insertion failed: %E\n"));
864           }
865     }
866 
867   if (link_info.strip != strip_none)
868     einfo (_("%P: `-retain-symbols-file' overrides `-s' and `-S'\n"));
869 
870   free (buf);
871   link_info.strip = strip_some;
872   fclose (file);
873 }
874 
875 /* Callbacks from the BFD linker routines.  */
876 
877 /* This is called when BFD has decided to include an archive member in
878    a link.  */
879 
880 static bool
add_archive_element(struct bfd_link_info * info,bfd * abfd,const char * name,bfd ** subsbfd ATTRIBUTE_UNUSED)881 add_archive_element (struct bfd_link_info *info,
882                          bfd *abfd,
883                          const char *name,
884                          bfd **subsbfd ATTRIBUTE_UNUSED)
885 {
886   lang_input_statement_type *input;
887   lang_input_statement_type *parent;
888   lang_input_statement_type orig_input;
889 
890   input = (lang_input_statement_type *)
891       xcalloc (1, sizeof (lang_input_statement_type));
892   input->header.type = lang_input_statement_enum;
893   input->filename = bfd_get_filename (abfd);
894   input->local_sym_name = bfd_get_filename (abfd);
895   input->the_bfd = abfd;
896 
897   /* Save the original data for trace files/tries below, as plugins
898      (if enabled) may possibly alter it to point to a replacement
899      BFD, but we still want to output the original BFD filename.  */
900   orig_input = *input;
901 #if BFD_SUPPORTS_PLUGINS
902   if (link_info.lto_plugin_active)
903     {
904       /* We must offer this archive member to the plugins to claim.  */
905       plugin_maybe_claim (input);
906       if (input->flags.claimed)
907           {
908             if (no_more_claiming)
909               {
910                 /* Don't claim new IR symbols after all IR symbols have
911                      been claimed.  */
912                 if (verbose)
913                     info_msg ("%pI: no new IR symbols to claim\n",
914                                 &orig_input);
915                 input->flags.claimed = 0;
916                 return false;
917               }
918             input->flags.claim_archive = true;
919             *subsbfd = input->the_bfd;
920           }
921     }
922 #endif /* BFD_SUPPORTS_PLUGINS */
923 
924   if (link_info.input_bfds_tail == &input->the_bfd->link.next
925       || input->the_bfd->link.next != NULL)
926     {
927       /* We have already loaded this element, and are attempting to
928            load it again.  This can happen when the archive map doesn't
929            match actual symbols defined by the element.  */
930       free (input);
931       bfd_set_error (bfd_error_malformed_archive);
932       return false;
933     }
934 
935   /* Set the file_chain pointer of archives to the last element loaded
936      from the archive.  See ldlang.c:find_rescan_insertion.  */
937   parent = bfd_usrdata (abfd->my_archive);
938   if (parent != NULL && !parent->flags.reload)
939     parent->next = input;
940 
941   ldlang_add_file (input);
942 
943   if (config.map_file != NULL)
944     {
945       static bool header_printed;
946       struct bfd_link_hash_entry *h;
947       bfd *from;
948       int len;
949 
950       h = bfd_link_hash_lookup (info->hash, name, false, false, true);
951       if (h == NULL
952             && info->pei386_auto_import
953             && startswith (name, "__imp_"))
954           h = bfd_link_hash_lookup (info->hash, name + 6, false, false, true);
955 
956       if (h == NULL)
957           from = NULL;
958       else
959           {
960             switch (h->type)
961               {
962               default:
963                 from = NULL;
964                 break;
965 
966               case bfd_link_hash_defined:
967               case bfd_link_hash_defweak:
968                 from = h->u.def.section->owner;
969                 break;
970 
971               case bfd_link_hash_undefined:
972               case bfd_link_hash_undefweak:
973                 from = h->u.undef.abfd;
974                 break;
975 
976               case bfd_link_hash_common:
977                 from = h->u.c.p->section->owner;
978                 break;
979               }
980           }
981 
982       if (!header_printed)
983           {
984             minfo (_("Archive member included to satisfy reference by file (symbol)\n\n"));
985             header_printed = true;
986           }
987 
988       if (abfd->my_archive == NULL
989             || bfd_is_thin_archive (abfd->my_archive))
990           {
991             minfo ("%s", bfd_get_filename (abfd));
992             len = strlen (bfd_get_filename (abfd));
993           }
994       else
995           {
996             minfo ("%s(%s)", bfd_get_filename (abfd->my_archive),
997                      bfd_get_filename (abfd));
998             len = (strlen (bfd_get_filename (abfd->my_archive))
999                      + strlen (bfd_get_filename (abfd))
1000                      + 2);
1001           }
1002 
1003       if (len >= 29)
1004           {
1005             print_nl ();
1006             len = 0;
1007           }
1008       print_spaces (30 - len);
1009 
1010       if (from != NULL)
1011           minfo ("%pB ", from);
1012       if (h != NULL)
1013           minfo ("(%pT)\n", h->root.string);
1014       else
1015           minfo ("(%s)\n", name);
1016     }
1017 
1018   if (verbose
1019       || trace_files > 1
1020       || (trace_files && bfd_is_thin_archive (orig_input.the_bfd->my_archive)))
1021     info_msg ("%pI\n", &orig_input);
1022   return true;
1023 }
1024 
1025 /* This is called when BFD has discovered a symbol which is defined
1026    multiple times.  */
1027 
1028 static void
multiple_definition(struct bfd_link_info * info,struct bfd_link_hash_entry * h,bfd * nbfd,asection * nsec,bfd_vma nval)1029 multiple_definition (struct bfd_link_info *info,
1030                          struct bfd_link_hash_entry *h,
1031                          bfd *nbfd,
1032                          asection *nsec,
1033                          bfd_vma nval)
1034 {
1035   const char *name;
1036   bfd *obfd;
1037   asection *osec;
1038   bfd_vma oval;
1039 
1040   if (info->allow_multiple_definition)
1041     return;
1042 
1043   switch (h->type)
1044     {
1045     case bfd_link_hash_defined:
1046       osec = h->u.def.section;
1047       oval = h->u.def.value;
1048       obfd = h->u.def.section->owner;
1049       break;
1050     case bfd_link_hash_indirect:
1051       osec = bfd_ind_section_ptr;
1052       oval = 0;
1053       obfd = NULL;
1054       break;
1055     default:
1056       abort ();
1057     }
1058 
1059   /* Ignore a redefinition of an absolute symbol to the
1060      same value; it's harmless.  */
1061   if (h->type == bfd_link_hash_defined
1062       && bfd_is_abs_section (osec)
1063       && bfd_is_abs_section (nsec)
1064       && nval == oval)
1065     return;
1066 
1067   /* If either section has the output_section field set to
1068      bfd_abs_section_ptr, it means that the section is being
1069      discarded, and this is not really a multiple definition at all.
1070      FIXME: It would be cleaner to somehow ignore symbols defined in
1071      sections which are being discarded.  */
1072   if (!info->prohibit_multiple_definition_absolute
1073       && ((osec->output_section != NULL
1074              && ! bfd_is_abs_section (osec)
1075              && bfd_is_abs_section (osec->output_section))
1076             || (nsec->output_section != NULL
1077                 && !bfd_is_abs_section (nsec)
1078                 && bfd_is_abs_section (nsec->output_section))))
1079     return;
1080 
1081   name = h->root.string;
1082   if (nbfd == NULL)
1083     {
1084       nbfd = obfd;
1085       nsec = osec;
1086       nval = oval;
1087       obfd = NULL;
1088     }
1089   if (info->warn_multiple_definition)
1090     einfo (_("%P: %C: warning: multiple definition of `%pT'"),
1091              nbfd, nsec, nval, name);
1092   else
1093     einfo (_("%X%P: %C: multiple definition of `%pT'"),
1094              nbfd, nsec, nval, name);
1095   if (obfd != NULL)
1096     einfo (_("; %D: first defined here"), obfd, osec, oval);
1097   einfo ("\n");
1098 
1099   if (RELAXATION_ENABLED_BY_USER)
1100     {
1101       einfo (_("%P: disabling relaxation; it will not work with multiple definitions\n"));
1102       DISABLE_RELAXATION;
1103     }
1104 }
1105 
1106 /* This is called when there is a definition of a common symbol, or
1107    when a common symbol is found for a symbol that is already defined,
1108    or when two common symbols are found.  We only do something if
1109    -warn-common was used.  */
1110 
1111 static void
multiple_common(struct bfd_link_info * info ATTRIBUTE_UNUSED,struct bfd_link_hash_entry * h,bfd * nbfd,enum bfd_link_hash_type ntype,bfd_vma nsize)1112 multiple_common (struct bfd_link_info *info ATTRIBUTE_UNUSED,
1113                      struct bfd_link_hash_entry *h,
1114                      bfd *nbfd,
1115                      enum bfd_link_hash_type ntype,
1116                      bfd_vma nsize)
1117 {
1118   const char *name;
1119   bfd *obfd;
1120   enum bfd_link_hash_type otype;
1121   bfd_vma osize;
1122 
1123   if (!config.warn_common)
1124     return;
1125 
1126   name = h->root.string;
1127   otype = h->type;
1128   if (otype == bfd_link_hash_common)
1129     {
1130       obfd = h->u.c.p->section->owner;
1131       osize = h->u.c.size;
1132     }
1133   else if (otype == bfd_link_hash_defined
1134              || otype == bfd_link_hash_defweak)
1135     {
1136       obfd = h->u.def.section->owner;
1137       osize = 0;
1138     }
1139   else
1140     {
1141       /* FIXME: It would nice if we could report the BFD which defined
1142            an indirect symbol, but we don't have anywhere to store the
1143            information.  */
1144       obfd = NULL;
1145       osize = 0;
1146     }
1147 
1148   if (ntype == bfd_link_hash_defined
1149       || ntype == bfd_link_hash_defweak
1150       || ntype == bfd_link_hash_indirect)
1151     {
1152       ASSERT (otype == bfd_link_hash_common);
1153       if (obfd != NULL)
1154           einfo (_("%P: %pB: warning: definition of `%pT' overriding common"
1155                      " from %pB\n"),
1156                  nbfd, name, obfd);
1157       else
1158           einfo (_("%P: %pB: warning: definition of `%pT' overriding common\n"),
1159                  nbfd, name);
1160     }
1161   else if (otype == bfd_link_hash_defined
1162              || otype == bfd_link_hash_defweak
1163              || otype == bfd_link_hash_indirect)
1164     {
1165       ASSERT (ntype == bfd_link_hash_common);
1166       if (obfd != NULL)
1167           einfo (_("%P: %pB: warning: common of `%pT' overridden by definition"
1168                      " from %pB\n"),
1169                  nbfd, name, obfd);
1170       else
1171           einfo (_("%P: %pB: warning: common of `%pT' overridden by definition\n"),
1172                  nbfd, name);
1173     }
1174   else
1175     {
1176       ASSERT (otype == bfd_link_hash_common && ntype == bfd_link_hash_common);
1177       if (osize > nsize)
1178           {
1179             if (obfd != NULL)
1180               einfo (_("%P: %pB: warning: common of `%pT' overridden"
1181                          " by larger common from %pB\n"),
1182                        nbfd, name, obfd);
1183             else
1184               einfo (_("%P: %pB: warning: common of `%pT' overridden"
1185                          " by larger common\n"),
1186                        nbfd, name);
1187           }
1188       else if (nsize > osize)
1189           {
1190             if (obfd != NULL)
1191               einfo (_("%P: %pB: warning: common of `%pT' overriding"
1192                          " smaller common from %pB\n"),
1193                        nbfd, name, obfd);
1194             else
1195               einfo (_("%P: %pB: warning: common of `%pT' overriding"
1196                          " smaller common\n"),
1197                        nbfd, name);
1198           }
1199       else
1200           {
1201             if (obfd != NULL)
1202               einfo (_("%P: %pB and %pB: warning: multiple common of `%pT'\n"),
1203                        nbfd, obfd, name);
1204             else
1205               einfo (_("%P: %pB: warning: multiple common of `%pT'\n"),
1206                        nbfd, name);
1207           }
1208     }
1209 }
1210 
1211 /* This is called when BFD has discovered a set element.  H is the
1212    entry in the linker hash table for the set.  SECTION and VALUE
1213    represent a value which should be added to the set.  */
1214 
1215 static void
add_to_set(struct bfd_link_info * info ATTRIBUTE_UNUSED,struct bfd_link_hash_entry * h,bfd_reloc_code_real_type reloc,bfd * abfd,asection * section,bfd_vma value)1216 add_to_set (struct bfd_link_info *info ATTRIBUTE_UNUSED,
1217               struct bfd_link_hash_entry *h,
1218               bfd_reloc_code_real_type reloc,
1219               bfd *abfd,
1220               asection *section,
1221               bfd_vma value)
1222 {
1223   if (config.warn_constructors)
1224     einfo (_("%P: warning: global constructor %s used\n"),
1225              h->root.string);
1226 
1227   if (!config.build_constructors)
1228     return;
1229 
1230   ldctor_add_set_entry (h, reloc, NULL, section, value);
1231 
1232   if (h->type == bfd_link_hash_new)
1233     {
1234       h->type = bfd_link_hash_undefined;
1235       h->u.undef.abfd = abfd;
1236       /* We don't call bfd_link_add_undef to add this to the list of
1237            undefined symbols because we are going to define it
1238            ourselves.  */
1239     }
1240 }
1241 
1242 /* This is called when BFD has discovered a constructor.  This is only
1243    called for some object file formats--those which do not handle
1244    constructors in some more clever fashion.  This is similar to
1245    adding an element to a set, but less general.  */
1246 
1247 static void
constructor_callback(struct bfd_link_info * info,bool constructor,const char * name,bfd * abfd,asection * section,bfd_vma value)1248 constructor_callback (struct bfd_link_info *info,
1249                           bool constructor,
1250                           const char *name,
1251                           bfd *abfd,
1252                           asection *section,
1253                           bfd_vma value)
1254 {
1255   char *s;
1256   struct bfd_link_hash_entry *h;
1257   char set_name[1 + sizeof "__CTOR_LIST__"];
1258 
1259   if (config.warn_constructors)
1260     einfo (_("%P: warning: global constructor %s used\n"), name);
1261 
1262   if (!config.build_constructors)
1263     return;
1264 
1265   /* Ensure that BFD_RELOC_CTOR exists now, so that we can give a
1266      useful error message.  */
1267   if (bfd_reloc_type_lookup (info->output_bfd, BFD_RELOC_CTOR) == NULL
1268       && (bfd_link_relocatable (info)
1269             || bfd_reloc_type_lookup (abfd, BFD_RELOC_CTOR) == NULL))
1270     einfo (_("%F%P: BFD backend error: BFD_RELOC_CTOR unsupported\n"));
1271 
1272   s = set_name;
1273   if (bfd_get_symbol_leading_char (abfd) != '\0')
1274     *s++ = bfd_get_symbol_leading_char (abfd);
1275   if (constructor)
1276     strcpy (s, "__CTOR_LIST__");
1277   else
1278     strcpy (s, "__DTOR_LIST__");
1279 
1280   h = bfd_link_hash_lookup (info->hash, set_name, true, true, true);
1281   if (h == (struct bfd_link_hash_entry *) NULL)
1282     einfo (_("%F%P: bfd_link_hash_lookup failed: %E\n"));
1283   if (h->type == bfd_link_hash_new)
1284     {
1285       h->type = bfd_link_hash_undefined;
1286       h->u.undef.abfd = abfd;
1287       /* We don't call bfd_link_add_undef to add this to the list of
1288            undefined symbols because we are going to define it
1289            ourselves.  */
1290     }
1291 
1292   ldctor_add_set_entry (h, BFD_RELOC_CTOR, name, section, value);
1293 }
1294 
1295 /* A structure used by warning_callback to pass information through
1296    bfd_map_over_sections.  */
1297 
1298 struct warning_callback_info
1299 {
1300   bool found;
1301   const char *warning;
1302   const char *symbol;
1303   asymbol **asymbols;
1304 };
1305 
1306 /* Look through the relocs to see if we can find a plausible address
1307    for SYMBOL in ABFD.  Return TRUE if found.  Otherwise return FALSE.  */
1308 
1309 static bool
symbol_warning(const char * warning,const char * symbol,bfd * abfd)1310 symbol_warning (const char *warning, const char *symbol, bfd *abfd)
1311 {
1312   struct warning_callback_info cinfo;
1313 
1314   if (!bfd_generic_link_read_symbols (abfd))
1315     einfo (_("%F%P: %pB: could not read symbols: %E\n"), abfd);
1316 
1317   cinfo.found = false;
1318   cinfo.warning = warning;
1319   cinfo.symbol = symbol;
1320   cinfo.asymbols = bfd_get_outsymbols (abfd);
1321   bfd_map_over_sections (abfd, warning_find_reloc, &cinfo);
1322   return cinfo.found;
1323 }
1324 
1325 /* This is called when there is a reference to a warning symbol.  */
1326 
1327 static void
warning_callback(struct bfd_link_info * info ATTRIBUTE_UNUSED,const char * warning,const char * symbol,bfd * abfd,asection * section,bfd_vma address)1328 warning_callback (struct bfd_link_info *info ATTRIBUTE_UNUSED,
1329                       const char *warning,
1330                       const char *symbol,
1331                       bfd *abfd,
1332                       asection *section,
1333                       bfd_vma address)
1334 {
1335   /* This is a hack to support warn_multiple_gp.  FIXME: This should
1336      have a cleaner interface, but what?  */
1337   if (!config.warn_multiple_gp
1338       && strcmp (warning, "using multiple gp values") == 0)
1339     return;
1340 
1341   if (section != NULL)
1342     einfo ("%P: %C: %s%s\n", abfd, section, address, _("warning: "), warning);
1343   else if (abfd == NULL)
1344     einfo ("%P: %s%s\n", _("warning: "), warning);
1345   else if (symbol == NULL)
1346     einfo ("%P: %pB: %s%s\n", abfd, _("warning: "), warning);
1347   else if (!symbol_warning (warning, symbol, abfd))
1348     {
1349       bfd *b;
1350       /* Search all input files for a reference to SYMBOL.  */
1351       for (b = info->input_bfds; b; b = b->link.next)
1352           if (b != abfd && symbol_warning (warning, symbol, b))
1353             return;
1354       einfo ("%P: %pB: %s%s\n", abfd, _("warning: "), warning);
1355     }
1356 }
1357 
1358 /* This is called by warning_callback for each section.  It checks the
1359    relocs of the section to see if it can find a reference to the
1360    symbol which triggered the warning.  If it can, it uses the reloc
1361    to give an error message with a file and line number.  */
1362 
1363 static void
warning_find_reloc(bfd * abfd,asection * sec,void * iarg)1364 warning_find_reloc (bfd *abfd, asection *sec, void *iarg)
1365 {
1366   struct warning_callback_info *info = (struct warning_callback_info *) iarg;
1367   long relsize;
1368   arelent **relpp;
1369   long relcount;
1370   arelent **p, **pend;
1371 
1372   if (info->found)
1373     return;
1374 
1375   relsize = bfd_get_reloc_upper_bound (abfd, sec);
1376   if (relsize < 0)
1377     einfo (_("%F%P: %pB: could not read relocs: %E\n"), abfd);
1378   if (relsize == 0)
1379     return;
1380 
1381   relpp = (arelent **) xmalloc (relsize);
1382   relcount = bfd_canonicalize_reloc (abfd, sec, relpp, info->asymbols);
1383   if (relcount < 0)
1384     einfo (_("%F%P: %pB: could not read relocs: %E\n"), abfd);
1385 
1386   p = relpp;
1387   pend = p + relcount;
1388   for (; p < pend && *p != NULL; p++)
1389     {
1390       arelent *q = *p;
1391 
1392       if (q->sym_ptr_ptr != NULL
1393             && *q->sym_ptr_ptr != NULL
1394             && strcmp (bfd_asymbol_name (*q->sym_ptr_ptr), info->symbol) == 0)
1395           {
1396             /* We found a reloc for the symbol we are looking for.  */
1397             einfo ("%P: %H: %s%s\n", abfd, sec, q->address, _("warning: "),
1398                      info->warning);
1399             info->found = true;
1400             break;
1401           }
1402     }
1403 
1404   free (relpp);
1405 }
1406 
1407 #if SUPPORT_ERROR_HANDLING_SCRIPT
1408 char * error_handling_script = NULL;
1409 #endif
1410 
1411 /* This is called when an undefined symbol is found.  */
1412 
1413 static void
undefined_symbol(struct bfd_link_info * info,const char * name,bfd * abfd,asection * section,bfd_vma address,bool error)1414 undefined_symbol (struct bfd_link_info *info,
1415                       const char *name,
1416                       bfd *abfd,
1417                       asection *section,
1418                       bfd_vma address,
1419                       bool error)
1420 {
1421   static char *error_name;
1422   static unsigned int error_count;
1423 
1424 #define MAX_ERRORS_IN_A_ROW 5
1425 
1426   if (info->ignore_hash != NULL
1427       && bfd_hash_lookup (info->ignore_hash, name, false, false) != NULL)
1428     return;
1429 
1430   if (config.warn_once)
1431     {
1432       /* Only warn once about a particular undefined symbol.  */
1433       add_ignoresym (info, name);
1434     }
1435 
1436   /* We never print more than a reasonable number of errors in a row
1437      for a single symbol.  */
1438   if (error_name != NULL
1439       && strcmp (name, error_name) == 0)
1440     ++error_count;
1441   else
1442     {
1443       error_count = 0;
1444       free (error_name);
1445       error_name = xstrdup (name);
1446     }
1447 
1448 #if SUPPORT_ERROR_HANDLING_SCRIPT
1449   if (error_handling_script != NULL
1450       && error_count < MAX_ERRORS_IN_A_ROW)
1451     {
1452       char *        argv[4];
1453       const char *  res;
1454       int           status, err;
1455 
1456       argv[0] = error_handling_script;
1457       argv[1] = "undefined-symbol";
1458       argv[2] = (char *) name;
1459       argv[3] = NULL;
1460 
1461       if (verbose)
1462           einfo (_("%P: About to run error handling script '%s' with arguments: '%s' '%s'\n"),
1463                  argv[0], argv[1], argv[2]);
1464 
1465       res = pex_one (PEX_SEARCH, error_handling_script, argv,
1466                          N_("error handling script"),
1467                          NULL /* Send stdout to random, temp file.  */,
1468                          NULL /* Write to stderr.  */,
1469                          &status, &err);
1470       if (res != NULL)
1471           {
1472             einfo (_("%P: Failed to run error handling script '%s', reason: "),
1473                      error_handling_script);
1474             /* FIXME: We assume here that errrno == err.  */
1475             perror (res);
1476           }
1477       /* We ignore the return status of the script and
1478            carry on to issue the normal error message.  */
1479     }
1480 #endif /* SUPPORT_ERROR_HANDLING_SCRIPT */
1481 
1482   if (section != NULL)
1483     {
1484       if (error_count < MAX_ERRORS_IN_A_ROW)
1485           {
1486             if (error)
1487               einfo (_("%X%P: %H: undefined reference to `%pT'\n"),
1488                        abfd, section, address, name);
1489             else
1490               einfo (_("%P: %H: warning: undefined reference to `%pT'\n"),
1491                        abfd, section, address, name);
1492           }
1493       else if (error_count == MAX_ERRORS_IN_A_ROW)
1494           {
1495             if (error)
1496               einfo (_("%X%P: %D: more undefined references to `%pT' follow\n"),
1497                        abfd, section, address, name);
1498             else
1499               einfo (_("%P: %D: warning: more undefined references to `%pT' follow\n"),
1500                        abfd, section, address, name);
1501           }
1502       else if (error)
1503           einfo ("%X");
1504     }
1505   else
1506     {
1507       if (error_count < MAX_ERRORS_IN_A_ROW)
1508           {
1509             if (error)
1510               einfo (_("%X%P: %pB: undefined reference to `%pT'\n"),
1511                        abfd, name);
1512             else
1513               einfo (_("%P: %pB: warning: undefined reference to `%pT'\n"),
1514                        abfd, name);
1515           }
1516       else if (error_count == MAX_ERRORS_IN_A_ROW)
1517           {
1518             if (error)
1519               einfo (_("%X%P: %pB: more undefined references to `%pT' follow\n"),
1520                        abfd, name);
1521             else
1522               einfo (_("%P: %pB: warning: more undefined references to `%pT' follow\n"),
1523                        abfd, name);
1524           }
1525       else if (error)
1526           einfo ("%X");
1527     }
1528 }
1529 
1530 /* Counter to limit the number of relocation overflow error messages
1531    to print.  Errors are printed as it is decremented.  When it's
1532    called and the counter is zero, a final message is printed
1533    indicating more relocations were omitted.  When it gets to -1, no
1534    such errors are printed.  If it's initially set to a value less
1535    than -1, all such errors will be printed (--verbose does this).  */
1536 
1537 int overflow_cutoff_limit = 10;
1538 
1539 /* This is called when a reloc overflows.  */
1540 
1541 static void
reloc_overflow(struct bfd_link_info * info,struct bfd_link_hash_entry * entry,const char * name,const char * reloc_name,bfd_vma addend,bfd * abfd,asection * section,bfd_vma address)1542 reloc_overflow (struct bfd_link_info *info,
1543                     struct bfd_link_hash_entry *entry,
1544                     const char *name,
1545                     const char *reloc_name,
1546                     bfd_vma addend,
1547                     bfd *abfd,
1548                     asection *section,
1549                     bfd_vma address)
1550 {
1551   if (overflow_cutoff_limit == -1)
1552     return;
1553 
1554   einfo ("%X%H:", abfd, section, address);
1555 
1556   if (overflow_cutoff_limit >= 0
1557       && overflow_cutoff_limit-- == 0)
1558     {
1559       einfo (_(" additional relocation overflows omitted from the output\n"));
1560       return;
1561     }
1562 
1563   if (entry)
1564     {
1565       while (entry->type == bfd_link_hash_indirect
1566                || entry->type == bfd_link_hash_warning)
1567           entry = entry->u.i.link;
1568       switch (entry->type)
1569           {
1570           case bfd_link_hash_undefined:
1571           case bfd_link_hash_undefweak:
1572             einfo (_(" relocation truncated to fit: "
1573                        "%s against undefined symbol `%pT'"),
1574                      reloc_name, entry->root.string);
1575             break;
1576           case bfd_link_hash_defined:
1577           case bfd_link_hash_defweak:
1578             einfo (_(" relocation truncated to fit: "
1579                        "%s against symbol `%pT' defined in %pA section in %pB"),
1580                      reloc_name, entry->root.string,
1581                      entry->u.def.section,
1582                      entry->u.def.section == bfd_abs_section_ptr
1583                      ? info->output_bfd : entry->u.def.section->owner);
1584             break;
1585           default:
1586             abort ();
1587             break;
1588           }
1589     }
1590   else
1591     einfo (_(" relocation truncated to fit: %s against `%pT'"),
1592              reloc_name, name);
1593   if (addend != 0)
1594     einfo ("+%v", addend);
1595   einfo ("\n");
1596 }
1597 
1598 /* This is called when a dangerous relocation is made.  */
1599 
1600 static void
reloc_dangerous(struct bfd_link_info * info ATTRIBUTE_UNUSED,const char * message,bfd * abfd,asection * section,bfd_vma address)1601 reloc_dangerous (struct bfd_link_info *info ATTRIBUTE_UNUSED,
1602                      const char *message,
1603                      bfd *abfd,
1604                      asection *section,
1605                      bfd_vma address)
1606 {
1607   einfo (_("%X%H: dangerous relocation: %s\n"),
1608            abfd, section, address, message);
1609 }
1610 
1611 /* This is called when a reloc is being generated attached to a symbol
1612    that is not being output.  */
1613 
1614 static void
unattached_reloc(struct bfd_link_info * info ATTRIBUTE_UNUSED,const char * name,bfd * abfd,asection * section,bfd_vma address)1615 unattached_reloc (struct bfd_link_info *info ATTRIBUTE_UNUSED,
1616                       const char *name,
1617                       bfd *abfd,
1618                       asection *section,
1619                       bfd_vma address)
1620 {
1621   einfo (_("%X%H: reloc refers to symbol `%pT' which is not being output\n"),
1622            abfd, section, address, name);
1623 }
1624 
1625 /* This is called if link_info.notice_all is set, or when a symbol in
1626    link_info.notice_hash is found.  Symbols are put in notice_hash
1627    using the -y option, while notice_all is set if the --cref option
1628    has been supplied, or if there are any NOCROSSREFS sections in the
1629    linker script; and if plugins are active, since they need to monitor
1630    all references from non-IR files.  */
1631 
1632 static bool
notice(struct bfd_link_info * info,struct bfd_link_hash_entry * h,struct bfd_link_hash_entry * inh ATTRIBUTE_UNUSED,bfd * abfd,asection * section,bfd_vma value,flagword flags ATTRIBUTE_UNUSED)1633 notice (struct bfd_link_info *info,
1634           struct bfd_link_hash_entry *h,
1635           struct bfd_link_hash_entry *inh ATTRIBUTE_UNUSED,
1636           bfd *abfd,
1637           asection *section,
1638           bfd_vma value,
1639           flagword flags ATTRIBUTE_UNUSED)
1640 {
1641   const char *name;
1642 
1643   if (h == NULL)
1644     {
1645       if (command_line.cref || nocrossref_list != NULL)
1646           return handle_asneeded_cref (abfd, (enum notice_asneeded_action) value);
1647       return true;
1648     }
1649 
1650   name = h->root.string;
1651   if (info->notice_hash != NULL
1652       && bfd_hash_lookup (info->notice_hash, name, false, false) != NULL)
1653     {
1654       if (bfd_is_und_section (section))
1655           einfo (_("%P: %pB: reference to %s\n"), abfd, name);
1656       else
1657           einfo (_("%P: %pB: definition of %s\n"), abfd, name);
1658     }
1659 
1660   if (command_line.cref || nocrossref_list != NULL)
1661     add_cref (name, abfd, section, value);
1662 
1663   return true;
1664 }
1665