1 /* $MirOS: src/gnu/usr.bin/binutils/ld/ldmain.c,v 1.5 2005/07/07 16:23:12 tg Exp $ */
2 
3 /* Main program of GNU linker.
4    Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
5    2002, 2003, 2004, 2005
6    Free Software Foundation, Inc.
7    Written by Steve Chamberlain steve@cygnus.com
8 
9    This file is part of GLD, the Gnu Linker.
10 
11    GLD is free software; you can redistribute it and/or modify
12    it under the terms of the GNU General Public License as published by
13    the Free Software Foundation; either version 2, or (at your option)
14    any later version.
15 
16    GLD is distributed in the hope that it will be useful,
17    but WITHOUT ANY WARRANTY; without even the implied warranty of
18    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19    GNU General Public License for more details.
20 
21    You should have received a copy of the GNU General Public License
22    along with GLD; see the file COPYING.  If not, write to the Free
23    Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
24    02110-1301, USA.  */
25 
26 #include "bfd.h"
27 #include "sysdep.h"
28 #include <stdio.h>
29 #include "safe-ctype.h"
30 #include "libiberty.h"
31 #include "progress.h"
32 #include "bfdlink.h"
33 #include "filenames.h"
34 
35 #include "ld.h"
36 #include "ldmain.h"
37 #include "ldmisc.h"
38 #include "ldwrite.h"
39 #include "ldexp.h"
40 #include "ldlang.h"
41 #include <ldgram.h>
42 #include "ldlex.h"
43 #include "ldfile.h"
44 #include "ldemul.h"
45 #include "ldctor.h"
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 #ifdef HAVE_SBRK
55 #if !HAVE_DECL_SBRK
56 extern void *sbrk ();
57 #endif
58 #endif
59 
60 #ifndef TARGET_SYSTEM_ROOT
61 #define TARGET_SYSTEM_ROOT ""
62 #endif
63 
64 __RCSID("$MirOS: src/gnu/usr.bin/binutils/ld/ldmain.c,v 1.5 2005/07/07 16:23:12 tg Exp $");
65 
66 /* EXPORTS */
67 
68 char *default_target;
69 const char *output_filename = "a.out";
70 
71 /* Name this program was invoked by.  */
72 char *program_name;
73 
74 /* The prefix for system library directories.  */
75 const char *ld_sysroot;
76 
77 /* The canonical representation of ld_sysroot.  */
78 char * ld_canon_sysroot;
79 int ld_canon_sysroot_len;
80 
81 /* The file that we're creating.  */
82 bfd *output_bfd = 0;
83 
84 /* Set by -G argument, for MIPS ECOFF target.  */
85 int g_switch_value = 8;
86 
87 /* Nonzero means print names of input files as processed.  */
88 bfd_boolean trace_files;
89 
90 /* Nonzero means same, but note open failures, too.  */
91 bfd_boolean trace_file_tries;
92 
93 /* Nonzero means version number was printed, so exit successfully
94    instead of complaining if no input files are given.  */
95 bfd_boolean version_printed;
96 
97 /* Nonzero means link in every member of an archive.  */
98 bfd_boolean whole_archive;
99 
100 /* Nonzero means create DT_NEEDED entries only if a dynamic library
101    actually satisfies some reference in a regular object.  */
102 bfd_boolean as_needed;
103 
104 /* Nonzero means never create DT_NEEDED entries for dynamic libraries
105    in DT_NEEDED tags.  */
106 bfd_boolean add_needed = TRUE;
107 
108 /* TRUE if we should demangle symbol names.  */
109 bfd_boolean demangling;
110 
111 args_type command_line;
112 
113 ld_config_type config;
114 
115 sort_type sort_section;
116 
117 static const char *get_sysroot
118   (int, char **);
119 static char *get_emulation
120   (int, char **);
121 static void set_scripts_dir
122   (void);
123 static bfd_boolean add_archive_element
124   (struct bfd_link_info *, bfd *, const char *);
125 static bfd_boolean multiple_definition
126   (struct bfd_link_info *, const char *, bfd *, asection *, bfd_vma,
127    bfd *, asection *, bfd_vma);
128 static bfd_boolean multiple_common
129   (struct bfd_link_info *, const char *, bfd *, enum bfd_link_hash_type,
130    bfd_vma, bfd *, enum bfd_link_hash_type, bfd_vma);
131 static bfd_boolean add_to_set
132   (struct bfd_link_info *, struct bfd_link_hash_entry *,
133    bfd_reloc_code_real_type, bfd *, asection *, bfd_vma);
134 static bfd_boolean constructor_callback
135   (struct bfd_link_info *, bfd_boolean, const char *, bfd *,
136    asection *, bfd_vma);
137 static bfd_boolean warning_callback
138   (struct bfd_link_info *, const char *, const char *, bfd *,
139    asection *, bfd_vma);
140 static void warning_find_reloc
141   (bfd *, asection *, void *);
142 static bfd_boolean undefined_symbol
143   (struct bfd_link_info *, const char *, bfd *, asection *, bfd_vma,
144    bfd_boolean);
145 static bfd_boolean reloc_overflow
146   (struct bfd_link_info *, struct bfd_link_hash_entry *, const char *,
147    const char *, bfd_vma, bfd *, asection *, bfd_vma);
148 static bfd_boolean reloc_dangerous
149   (struct bfd_link_info *, const char *, bfd *, asection *, bfd_vma);
150 static bfd_boolean unattached_reloc
151   (struct bfd_link_info *, const char *, bfd *, asection *, bfd_vma);
152 static bfd_boolean notice
153   (struct bfd_link_info *, const char *, bfd *, asection *, bfd_vma);
154 
155 static struct bfd_link_callbacks link_callbacks =
156 {
157   add_archive_element,
158   multiple_definition,
159   multiple_common,
160   add_to_set,
161   constructor_callback,
162   warning_callback,
163   undefined_symbol,
164   reloc_overflow,
165   reloc_dangerous,
166   unattached_reloc,
167   notice,
168   einfo
169 };
170 
171 struct bfd_link_info link_info;
172 
173 static void
remove_output(void)174 remove_output (void)
175 {
176   if (output_filename)
177     {
178       if (output_bfd)
179 	bfd_cache_close (output_bfd);
180       if (delete_output_file_on_failure)
181 	unlink_if_ordinary (output_filename);
182     }
183 }
184 
185 int
main(int argc,char ** argv)186 main (int argc, char **argv)
187 {
188   char *emulation;
189   long start_time = get_run_time ();
190 
191 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
192   setlocale (LC_MESSAGES, "");
193 #endif
194 #if defined (HAVE_SETLOCALE)
195   setlocale (LC_CTYPE, "");
196 #endif
197   bindtextdomain (PACKAGE, LOCALEDIR);
198   textdomain (PACKAGE);
199 
200   program_name = argv[0];
201   xmalloc_set_program_name (program_name);
202 
203   START_PROGRESS (program_name, 0);
204 
205   bfd_init ();
206 
207   bfd_set_error_program_name (program_name);
208 
209   xatexit (remove_output);
210 
211   /* Set up the sysroot directory.  */
212   ld_sysroot = get_sysroot (argc, argv);
213   if (*ld_sysroot)
214     {
215       if (*TARGET_SYSTEM_ROOT == 0)
216 	{
217 	  einfo ("%P%F: this linker was not configured to use sysroots");
218 	  ld_sysroot = "";
219 	}
220       else
221 	ld_canon_sysroot = lrealpath (ld_sysroot);
222     }
223   if (ld_canon_sysroot)
224     ld_canon_sysroot_len = strlen (ld_canon_sysroot);
225   else
226     ld_canon_sysroot_len = -1;
227 
228   /* Set the default BFD target based on the configured target.  Doing
229      this permits the linker to be configured for a particular target,
230      and linked against a shared BFD library which was configured for
231      a different target.  The macro TARGET is defined by Makefile.  */
232   if (! bfd_set_default_target (TARGET))
233     {
234       einfo (_("%X%P: can't set BFD default target to `%s': %E\n"), TARGET);
235       xexit (1);
236     }
237 
238 #if YYDEBUG
239   {
240     extern int yydebug;
241     yydebug = 1;
242   }
243 #endif
244 
245   /* Initialize the data about options.  */
246   trace_files = trace_file_tries = version_printed = FALSE;
247   whole_archive = FALSE;
248   config.build_constructors = TRUE;
249   config.dynamic_link = FALSE;
250   config.has_shared = FALSE;
251   config.split_by_reloc = (unsigned) -1;
252   config.split_by_file = (bfd_size_type) -1;
253   config.hash_table_size = 0;
254   command_line.force_common_definition = FALSE;
255   command_line.inhibit_common_definition = FALSE;
256   command_line.interpreter = NULL;
257   command_line.rpath = NULL;
258   command_line.warn_mismatch = TRUE;
259   command_line.check_section_addresses = TRUE;
260   command_line.accept_unknown_input_arch = FALSE;
261   command_line.reduce_memory_overheads = FALSE;
262 
263   sort_section = none;
264 
265   /* We initialize DEMANGLING based on the environment variable
266      COLLECT_NO_DEMANGLE.  The gcc collect2 program will demangle the
267      output of the linker, unless COLLECT_NO_DEMANGLE is set in the
268      environment.  Acting the same way here lets us provide the same
269      interface by default.  */
270   demangling = getenv ("COLLECT_NO_DEMANGLE") == NULL;
271 
272   link_info.relocatable = FALSE;
273   link_info.emitrelocations = FALSE;
274   link_info.task_link = FALSE;
275   link_info.shared = FALSE;
276   link_info.pie = FALSE;
277   link_info.executable = FALSE;
278   link_info.symbolic = FALSE;
279   link_info.export_dynamic = FALSE;
280   link_info.static_link = FALSE;
281   link_info.traditional_format = FALSE;
282   link_info.optimize = FALSE;
283   link_info.unresolved_syms_in_objects = RM_NOT_YET_SET;
284   link_info.unresolved_syms_in_shared_libs = RM_NOT_YET_SET;
285   link_info.allow_multiple_definition = FALSE;
286   link_info.allow_undefined_version = TRUE;
287   link_info.create_default_symver = FALSE;
288   link_info.default_imported_symver = FALSE;
289   link_info.keep_memory = TRUE;
290   link_info.notice_all = FALSE;
291   link_info.nocopyreloc = FALSE;
292   link_info.new_dtags = FALSE;
293   link_info.combreloc = TRUE;
294   link_info.eh_frame_hdr = FALSE;
295   link_info.relro = FALSE;
296   link_info.strip_discarded = TRUE;
297   link_info.strip = strip_none;
298   link_info.discard = discard_sec_merge;
299   link_info.common_skip_ar_aymbols = bfd_link_common_skip_none;
300   link_info.callbacks = &link_callbacks;
301   link_info.hash = NULL;
302   link_info.keep_hash = NULL;
303   link_info.notice_hash = NULL;
304   link_info.wrap_hash = NULL;
305   link_info.input_bfds = NULL;
306   link_info.create_object_symbols_section = NULL;
307   link_info.gc_sym_list = NULL;
308   link_info.base_file = NULL;
309   /* SVR4 linkers seem to set DT_INIT and DT_FINI based on magic _init
310      and _fini symbols.  We are compatible.  */
311   link_info.init_function = "_init";
312   link_info.fini_function = "_fini";
313   link_info.pei386_auto_import = -1;
314   link_info.pei386_runtime_pseudo_reloc = FALSE;
315   link_info.spare_dynamic_tags = 5;
316   link_info.flags = 0;
317   link_info.flags_1 = 0;
318   link_info.need_relax_finalize = FALSE;
319   link_info.warn_shared_textrel = FALSE;
320   link_info.gc_sections = FALSE;
321 
322   ldfile_add_arch ("");
323 
324   config.make_executable = TRUE;
325   force_make_executable = FALSE;
326   config.magic_demand_paged = TRUE;
327   config.text_read_only = TRUE;
328   config.data_bss_contig = FALSE;
329 
330   emulation = get_emulation (argc, argv);
331   ldemul_choose_mode (emulation);
332   default_target = ldemul_choose_target (argc, argv);
333   lang_init ();
334   ldemul_before_parse ();
335   lang_has_input_file = FALSE;
336   parse_args (argc, argv);
337 
338   if (config.hash_table_size != 0)
339     bfd_hash_set_default_size (config.hash_table_size);
340 
341   ldemul_set_symbols ();
342 
343   if (link_info.relocatable)
344     {
345       if (link_info.gc_sections)
346 	einfo ("%P%F: --gc-sections and -r may not be used together\n");
347       else if (command_line.relax)
348 	einfo (_("%P%F: --relax and -r may not be used together\n"));
349       if (link_info.shared)
350 	einfo (_("%P%F: -r and -shared may not be used together\n"));
351     }
352 
353    if (!config.dynamic_link && link_info.shared)
354      einfo (_("%P%F: -static and -shared may not be used together\n"));
355 
356   if (! link_info.shared)
357     {
358       if (command_line.filter_shlib)
359 	einfo (_("%P%F: -F may not be used without -shared\n"));
360       if (command_line.auxiliary_filters)
361 	einfo (_("%P%F: -f may not be used without -shared\n"));
362     }
363 
364   if (! link_info.shared || link_info.pie)
365     link_info.executable = TRUE;
366 
367   /* Treat ld -r -s as ld -r -S -x (i.e., strip all local symbols).  I
368      don't see how else this can be handled, since in this case we
369      must preserve all externally visible symbols.  */
370   if (link_info.relocatable && link_info.strip == strip_all)
371     {
372       link_info.strip = strip_debugger;
373       if (link_info.discard == discard_sec_merge)
374 	link_info.discard = discard_all;
375     }
376 
377   /* This essentially adds another -L directory so this must be done after
378      the -L's in argv have been processed.  */
379   set_scripts_dir ();
380 
381   /* If we have not already opened and parsed a linker script
382      read the emulation's appropriate default script.  */
383   if (saved_script_handle == NULL)
384     {
385       int isfile;
386       char *s = ldemul_get_script (&isfile);
387 
388       if (isfile)
389 	ldfile_open_command_file (s);
390       else
391 	{
392 	  lex_string = s;
393 	  lex_redirect (s);
394 	}
395       parser_input = input_script;
396       yyparse ();
397       lex_string = NULL;
398     }
399 
400   if (trace_file_tries)
401     {
402       if (saved_script_handle)
403 	info_msg (_("using external linker script:"));
404       else
405 	info_msg (_("using internal linker script:"));
406       info_msg ("\n==================================================\n");
407 
408       if (saved_script_handle)
409 	{
410 	  static const int ld_bufsz = 8193;
411 	  size_t n;
412 	  char *buf = xmalloc (ld_bufsz);
413 
414 	  rewind (saved_script_handle);
415 	  while ((n = fread (buf, 1, ld_bufsz - 1, saved_script_handle)) > 0)
416 	    {
417 	      buf[n] = 0;
418 	      info_msg (buf);
419 	    }
420 	  rewind (saved_script_handle);
421 	  free (buf);
422 	}
423       else
424 	{
425 	  int isfile;
426 
427 	  info_msg (ldemul_get_script (&isfile));
428 	}
429 
430       info_msg ("\n==================================================\n");
431     }
432 
433   lang_final ();
434 
435   if (!lang_has_input_file)
436     {
437       if (version_printed)
438 	xexit (0);
439       einfo (_("%P%F: no input files\n"));
440     }
441 
442   if (trace_files)
443     info_msg (_("%P: mode %s\n"), emulation);
444 
445   ldemul_after_parse ();
446 
447   if (config.map_filename)
448     {
449       if (strcmp (config.map_filename, "-") == 0)
450 	{
451 	  config.map_file = stdout;
452 	}
453       else
454 	{
455 	  config.map_file = fopen (config.map_filename, FOPEN_WT);
456 	  if (config.map_file == (FILE *) NULL)
457 	    {
458 	      bfd_set_error (bfd_error_system_call);
459 	      einfo (_("%P%F: cannot open map file %s: %E\n"),
460 		     config.map_filename);
461 	    }
462 	}
463     }
464 
465   lang_process ();
466 
467   /* Print error messages for any missing symbols, for any warning
468      symbols, and possibly multiple definitions.  */
469   if (link_info.relocatable)
470     output_bfd->flags &= ~EXEC_P;
471   else
472     output_bfd->flags |= EXEC_P;
473 
474   ldwrite ();
475 
476   if (config.map_file != NULL)
477     lang_map ();
478   if (command_line.cref)
479     output_cref (config.map_file != NULL ? config.map_file : stdout);
480   if (nocrossref_list != NULL)
481     check_nocrossrefs ();
482 
483   /* Even if we're producing relocatable output, some non-fatal errors should
484      be reported in the exit status.  (What non-fatal errors, if any, do we
485      want to ignore for relocatable output?)  */
486   if (!config.make_executable && !force_make_executable)
487     {
488       if (trace_files)
489 	einfo (_("%P: link errors found, deleting executable `%s'\n"),
490 	       output_filename);
491 
492       /* The file will be removed by remove_output.  */
493       xexit (1);
494     }
495   else
496     {
497       if (! bfd_close (output_bfd))
498 	einfo (_("%F%B: final close failed: %E\n"), output_bfd);
499 
500       /* If the --force-exe-suffix is enabled, and we're making an
501 	 executable file and it doesn't end in .exe, copy it to one
502 	 which does.  */
503       if (! link_info.relocatable && command_line.force_exe_suffix)
504 	{
505 	  int len = strlen (output_filename);
506 
507 	  if (len < 4
508 	      || (strcasecmp (output_filename + len - 4, ".exe") != 0
509 		  && strcasecmp (output_filename + len - 4, ".dll") != 0))
510 	    {
511 	      FILE *src;
512 	      FILE *dst;
513 	      const int bsize = 4096;
514 	      char *buf = xmalloc (bsize);
515 	      int l;
516 	      char *dst_name = xmalloc (len + 5);
517 
518 	      strcpy (dst_name, output_filename);
519 	      strcat (dst_name, ".exe");
520 	      src = fopen (output_filename, FOPEN_RB);
521 	      dst = fopen (dst_name, FOPEN_WB);
522 
523 	      if (!src)
524 		einfo (_("%X%P: unable to open for source of copy `%s'\n"),
525 		       output_filename);
526 	      if (!dst)
527 		einfo (_("%X%P: unable to open for destination of copy `%s'\n"),
528 		       dst_name);
529 	      while ((l = fread (buf, 1, bsize, src)) > 0)
530 		{
531 		  int done = fwrite (buf, 1, l, dst);
532 
533 		  if (done != l)
534 		    einfo (_("%P: Error writing file `%s'\n"), dst_name);
535 		}
536 
537 	      fclose (src);
538 	      if (fclose (dst) == EOF)
539 		einfo (_("%P: Error closing file `%s'\n"), dst_name);
540 	      free (dst_name);
541 	      free (buf);
542 	    }
543 	}
544     }
545 
546   END_PROGRESS (program_name);
547 
548   if (config.stats)
549     {
550 #ifdef HAVE_SBRK
551       char *lim = sbrk (0);
552 #endif
553       long run_time = get_run_time () - start_time;
554 
555       fprintf (stderr, _("%s: total time in link: %ld.%06ld\n"),
556 	       program_name, run_time / 1000000, run_time % 1000000);
557 #ifdef HAVE_SBRK
558       fprintf (stderr, _("%s: data size %ld\n"), program_name,
559 	       (long) (lim - (char *) &environ));
560 #endif
561     }
562 
563   /* Prevent remove_output from doing anything, after a successful link.  */
564   output_filename = NULL;
565 
566   xexit (0);
567   return 0;
568 }
569 
570 /* If the configured sysroot is relocatable, try relocating it based on
571    default prefix FROM.  Return the relocated directory if it exists,
572    otherwise return null.  */
573 
574 static char *
get_relative_sysroot(const char * from ATTRIBUTE_UNUSED)575 get_relative_sysroot (const char *from ATTRIBUTE_UNUSED)
576 {
577 #ifdef TARGET_SYSTEM_ROOT_RELOCATABLE
578   char *path;
579   struct stat s;
580 
581   path = make_relative_prefix (program_name, from, TARGET_SYSTEM_ROOT);
582   if (path)
583     {
584       if (stat (path, &s) == 0 && S_ISDIR (s.st_mode))
585 	return path;
586       free (path);
587     }
588 #endif
589   return 0;
590 }
591 
592 /* Return the sysroot directory.  Return "" if no sysroot is being used.  */
593 
594 static const char *
get_sysroot(int argc,char ** argv)595 get_sysroot (int argc, char **argv)
596 {
597   int i;
598   const char *path;
599 
600   for (i = 1; i < argc; i++)
601     if (strncmp (argv[i], "--sysroot=", strlen ("--sysroot=")) == 0)
602       return argv[i] + strlen ("--sysroot=");
603 
604   path = get_relative_sysroot (BINDIR);
605   if (path)
606     return path;
607 
608   path = get_relative_sysroot (TOOLBINDIR);
609   if (path)
610     return path;
611 
612   return TARGET_SYSTEM_ROOT;
613 }
614 
615 /* We need to find any explicitly given emulation in order to initialize the
616    state that's needed by the lex&yacc argument parser (parse_args).  */
617 
618 static char *
get_emulation(int argc,char ** argv)619 get_emulation (int argc, char **argv)
620 {
621   char *emulation;
622   int i;
623 
624   emulation = getenv (EMULATION_ENVIRON);
625   if (emulation == NULL)
626     emulation = DEFAULT_EMULATION;
627 
628   for (i = 1; i < argc; i++)
629     {
630       if (!strncmp (argv[i], "-m", 2))
631 	{
632 	  if (argv[i][2] == '\0')
633 	    {
634 	      /* -m EMUL */
635 	      if (i < argc - 1)
636 		{
637 		  emulation = argv[i + 1];
638 		  i++;
639 		}
640 	      else
641 		einfo (_("%P%F: missing argument to -m\n"));
642 	    }
643 	  else if (strcmp (argv[i], "-mips1") == 0
644 		   || strcmp (argv[i], "-mips2") == 0
645 		   || strcmp (argv[i], "-mips3") == 0
646 		   || strcmp (argv[i], "-mips4") == 0
647 		   || strcmp (argv[i], "-mips5") == 0
648 		   || strcmp (argv[i], "-mips32") == 0
649 		   || strcmp (argv[i], "-mips32r2") == 0
650 		   || strcmp (argv[i], "-mips64") == 0
651 		   || strcmp (argv[i], "-mips64r2") == 0)
652 	    {
653 	      /* FIXME: The arguments -mips1, -mips2, -mips3, etc. are
654 		 passed to the linker by some MIPS compilers.  They
655 		 generally tell the linker to use a slightly different
656 		 library path.  Perhaps someday these should be
657 		 implemented as emulations; until then, we just ignore
658 		 the arguments and hope that nobody ever creates
659 		 emulations named ips1, ips2 or ips3.  */
660 	    }
661 	  else if (strcmp (argv[i], "-m486") == 0)
662 	    {
663 	      /* FIXME: The argument -m486 is passed to the linker on
664 		 some Linux systems.  Hope that nobody creates an
665 		 emulation named 486.  */
666 	    }
667 	  else
668 	    {
669 	      /* -mEMUL */
670 	      emulation = &argv[i][2];
671 	    }
672 	}
673     }
674 
675   return emulation;
676 }
677 
678 /* If directory DIR contains an "ldscripts" subdirectory,
679    add DIR to the library search path and return TRUE,
680    else return FALSE.  */
681 
682 static bfd_boolean
check_for_scripts_dir(char * dir)683 check_for_scripts_dir (char *dir)
684 {
685   size_t dirlen;
686   char *buf;
687   struct stat s;
688   bfd_boolean res;
689 
690   dirlen = strlen (dir);
691   /* sizeof counts the terminating NUL.  */
692   buf = xmalloc (dirlen + sizeof ("/ldscripts"));
693   sprintf (buf, "%s/ldscripts", dir);
694 
695   res = stat (buf, &s) == 0 && S_ISDIR (s.st_mode);
696   free (buf);
697   if (res)
698     ldfile_add_library_path (dir, FALSE);
699   return res;
700 }
701 
702 /* Set the default directory for finding script files.
703    Libraries will be searched for here too, but that's ok.
704    We look for the "ldscripts" directory in:
705 
706    SCRIPTDIR (passed from Makefile)
707 	     (adjusted according to the current location of the binary)
708    SCRIPTDIR (passed from Makefile)
709    the dir where this program is (for using it from the build tree)
710    the dir where this program is/../lib
711 	     (for installing the tool suite elsewhere).  */
712 
713 static void
set_scripts_dir(void)714 set_scripts_dir (void)
715 {
716   char *end, *dir;
717   size_t dirlen;
718   bfd_boolean found;
719 
720   dir = make_relative_prefix (program_name, BINDIR, SCRIPTDIR);
721   if (dir)
722     {
723       found = check_for_scripts_dir (dir);
724       free (dir);
725       if (found)
726 	return;
727     }
728 
729   dir = make_relative_prefix (program_name, TOOLBINDIR, SCRIPTDIR);
730   if (dir)
731     {
732       found = check_for_scripts_dir (dir);
733       free (dir);
734       if (found)
735 	return;
736     }
737 
738   if (check_for_scripts_dir (SCRIPTDIR))
739     /* We've been installed normally.  */
740     return;
741 
742   /* Look for "ldscripts" in the dir where our binary is.  */
743   end = strrchr (program_name, '/');
744 #ifdef HAVE_DOS_BASED_FILE_SYSTEM
745   {
746     /* We could have \foo\bar, or /foo\bar.  */
747     char *bslash = strrchr (program_name, '\\');
748 
749     if (end == NULL || (bslash != NULL && bslash > end))
750       end = bslash;
751   }
752 #endif
753 
754   if (end == NULL)
755     /* Don't look for ldscripts in the current directory.  There is
756        too much potential for confusion.  */
757     return;
758 
759   dirlen = end - program_name;
760   /* Make a copy of program_name in dir.
761      Leave room for later "/../lib".  */
762   dir = xmalloc (dirlen + 8);
763   strncpy (dir, program_name, dirlen);
764   dir[dirlen] = '\0';
765 
766   if (check_for_scripts_dir (dir))
767     {
768       free (dir);
769       return;
770     }
771 
772   /* Look for "ldscripts" in <the dir where our binary is>/../lib.  */
773   strcpy (dir + dirlen, "/../lib");
774   check_for_scripts_dir (dir);
775   free (dir);
776 }
777 
778 void
add_ysym(const char * name)779 add_ysym (const char *name)
780 {
781   if (link_info.notice_hash == NULL)
782     {
783       link_info.notice_hash = xmalloc (sizeof (struct bfd_hash_table));
784       if (! bfd_hash_table_init_n (link_info.notice_hash,
785 				   bfd_hash_newfunc,
786 				   61))
787 	einfo (_("%P%F: bfd_hash_table_init failed: %E\n"));
788     }
789 
790   if (bfd_hash_lookup (link_info.notice_hash, name, TRUE, TRUE) == NULL)
791     einfo (_("%P%F: bfd_hash_lookup failed: %E\n"));
792 }
793 
794 /* Record a symbol to be wrapped, from the --wrap option.  */
795 
796 void
add_wrap(const char * name)797 add_wrap (const char *name)
798 {
799   if (link_info.wrap_hash == NULL)
800     {
801       link_info.wrap_hash = xmalloc (sizeof (struct bfd_hash_table));
802       if (! bfd_hash_table_init_n (link_info.wrap_hash,
803 				   bfd_hash_newfunc,
804 				   61))
805 	einfo (_("%P%F: bfd_hash_table_init failed: %E\n"));
806     }
807 
808   if (bfd_hash_lookup (link_info.wrap_hash, name, TRUE, TRUE) == NULL)
809     einfo (_("%P%F: bfd_hash_lookup failed: %E\n"));
810 }
811 
812 /* Handle the -retain-symbols-file option.  */
813 
814 void
add_keepsyms_file(const char * filename)815 add_keepsyms_file (const char *filename)
816 {
817   FILE *file;
818   char *buf;
819   size_t bufsize;
820   int c;
821 
822   if (link_info.strip == strip_some)
823     einfo (_("%X%P: error: duplicate retain-symbols-file\n"));
824 
825   file = fopen (filename, "r");
826   if (file == NULL)
827     {
828       bfd_set_error (bfd_error_system_call);
829       einfo ("%X%P: %s: %E\n", filename);
830       return;
831     }
832 
833   link_info.keep_hash = xmalloc (sizeof (struct bfd_hash_table));
834   if (! bfd_hash_table_init (link_info.keep_hash, bfd_hash_newfunc))
835     einfo (_("%P%F: bfd_hash_table_init failed: %E\n"));
836 
837   bufsize = 100;
838   buf = xmalloc (bufsize);
839 
840   c = getc (file);
841   while (c != EOF)
842     {
843       while (ISSPACE (c))
844 	c = getc (file);
845 
846       if (c != EOF)
847 	{
848 	  size_t len = 0;
849 
850 	  while (! ISSPACE (c) && c != EOF)
851 	    {
852 	      buf[len] = c;
853 	      ++len;
854 	      if (len >= bufsize)
855 		{
856 		  bufsize *= 2;
857 		  buf = xrealloc (buf, bufsize);
858 		}
859 	      c = getc (file);
860 	    }
861 
862 	  buf[len] = '\0';
863 
864 	  if (bfd_hash_lookup (link_info.keep_hash, buf, TRUE, TRUE) == NULL)
865 	    einfo (_("%P%F: bfd_hash_lookup for insertion failed: %E\n"));
866 	}
867     }
868 
869   if (link_info.strip != strip_none)
870     einfo (_("%P: `-retain-symbols-file' overrides `-s' and `-S'\n"));
871 
872   free (buf);
873   link_info.strip = strip_some;
874 }
875 
876 /* Callbacks from the BFD linker routines.  */
877 
878 /* This is called when BFD has decided to include an archive member in
879    a link.  */
880 
881 static bfd_boolean
add_archive_element(struct bfd_link_info * info,bfd * abfd,const char * name)882 add_archive_element (struct bfd_link_info *info,
883 		     bfd *abfd,
884 		     const char *name)
885 {
886   lang_input_statement_type *input;
887 
888   input = xmalloc (sizeof (lang_input_statement_type));
889   input->filename = abfd->filename;
890   input->local_sym_name = abfd->filename;
891   input->the_bfd = abfd;
892   input->asymbols = NULL;
893   input->next = NULL;
894   input->just_syms_flag = FALSE;
895   input->loaded = FALSE;
896   input->search_dirs_flag = FALSE;
897 
898   /* FIXME: The following fields are not set: header.next,
899      header.type, closed, passive_position, symbol_count,
900      next_real_file, is_archive, target, real.  This bit of code is
901      from the old decode_library_subfile function.  I don't know
902      whether any of those fields matters.  */
903 
904   ldlang_add_file (input);
905 
906   if (config.map_file != NULL)
907     {
908       static bfd_boolean header_printed;
909       struct bfd_link_hash_entry *h;
910       bfd *from;
911       int len;
912 
913       h = bfd_link_hash_lookup (info->hash, name, FALSE, FALSE, TRUE);
914 
915       if (h == NULL)
916 	from = NULL;
917       else
918 	{
919 	  switch (h->type)
920 	    {
921 	    default:
922 	      from = NULL;
923 	      break;
924 
925 	    case bfd_link_hash_defined:
926 	    case bfd_link_hash_defweak:
927 	      from = h->u.def.section->owner;
928 	      break;
929 
930 	    case bfd_link_hash_undefined:
931 	    case bfd_link_hash_undefweak:
932 	      from = h->u.undef.abfd;
933 	      break;
934 
935 	    case bfd_link_hash_common:
936 	      from = h->u.c.p->section->owner;
937 	      break;
938 	    }
939 	}
940 
941       if (! header_printed)
942 	{
943 	  char buf[100];
944 
945 	  sprintf (buf, _("Archive member included because of file (symbol)\n\n"));
946 	  minfo ("%s", buf);
947 	  header_printed = TRUE;
948 	}
949 
950       if (bfd_my_archive (abfd) == NULL)
951 	{
952 	  minfo ("%s", bfd_get_filename (abfd));
953 	  len = strlen (bfd_get_filename (abfd));
954 	}
955       else
956 	{
957 	  minfo ("%s(%s)", bfd_get_filename (bfd_my_archive (abfd)),
958 		 bfd_get_filename (abfd));
959 	  len = (strlen (bfd_get_filename (bfd_my_archive (abfd)))
960 		 + strlen (bfd_get_filename (abfd))
961 		 + 2);
962 	}
963 
964       if (len >= 29)
965 	{
966 	  print_nl ();
967 	  len = 0;
968 	}
969       while (len < 30)
970 	{
971 	  print_space ();
972 	  ++len;
973 	}
974 
975       if (from != NULL)
976 	minfo ("%B ", from);
977       if (h != NULL)
978 	minfo ("(%T)\n", h->root.string);
979       else
980 	minfo ("(%s)\n", name);
981     }
982 
983   if (trace_files || trace_file_tries)
984     info_msg ("%I\n", input);
985 
986   return TRUE;
987 }
988 
989 /* This is called when BFD has discovered a symbol which is defined
990    multiple times.  */
991 
992 static bfd_boolean
multiple_definition(struct bfd_link_info * info ATTRIBUTE_UNUSED,const char * name,bfd * obfd,asection * osec,bfd_vma oval,bfd * nbfd,asection * nsec,bfd_vma nval)993 multiple_definition (struct bfd_link_info *info ATTRIBUTE_UNUSED,
994 		     const char *name,
995 		     bfd *obfd,
996 		     asection *osec,
997 		     bfd_vma oval,
998 		     bfd *nbfd,
999 		     asection *nsec,
1000 		     bfd_vma nval)
1001 {
1002   /* If either section has the output_section field set to
1003      bfd_abs_section_ptr, it means that the section is being
1004      discarded, and this is not really a multiple definition at all.
1005      FIXME: It would be cleaner to somehow ignore symbols defined in
1006      sections which are being discarded.  */
1007   if ((osec->output_section != NULL
1008        && ! bfd_is_abs_section (osec)
1009        && bfd_is_abs_section (osec->output_section))
1010       || (nsec->output_section != NULL
1011 	  && ! bfd_is_abs_section (nsec)
1012 	  && bfd_is_abs_section (nsec->output_section)))
1013     return TRUE;
1014 
1015   einfo (_("%X%C: multiple definition of `%T'\n"),
1016 	 nbfd, nsec, nval, name);
1017   if (obfd != NULL)
1018     einfo (_("%D: first defined here\n"), obfd, osec, oval);
1019 
1020   if (command_line.relax)
1021     {
1022       einfo (_("%P: Disabling relaxation: it will not work with multiple definitions\n"));
1023       command_line.relax = 0;
1024     }
1025 
1026   return TRUE;
1027 }
1028 
1029 /* This is called when there is a definition of a common symbol, or
1030    when a common symbol is found for a symbol that is already defined,
1031    or when two common symbols are found.  We only do something if
1032    -warn-common was used.  */
1033 
1034 static bfd_boolean
multiple_common(struct bfd_link_info * info ATTRIBUTE_UNUSED,const char * name,bfd * obfd,enum bfd_link_hash_type otype,bfd_vma osize,bfd * nbfd,enum bfd_link_hash_type ntype,bfd_vma nsize)1035 multiple_common (struct bfd_link_info *info ATTRIBUTE_UNUSED,
1036 		 const char *name,
1037 		 bfd *obfd,
1038 		 enum bfd_link_hash_type otype,
1039 		 bfd_vma osize,
1040 		 bfd *nbfd,
1041 		 enum bfd_link_hash_type ntype,
1042 		 bfd_vma nsize)
1043 {
1044   if (! config.warn_common)
1045     return TRUE;
1046 
1047   if (ntype == bfd_link_hash_defined
1048       || ntype == bfd_link_hash_defweak
1049       || ntype == bfd_link_hash_indirect)
1050     {
1051       ASSERT (otype == bfd_link_hash_common);
1052       einfo (_("%B: warning: definition of `%T' overriding common\n"),
1053 	     nbfd, name);
1054       if (obfd != NULL)
1055 	einfo (_("%B: warning: common is here\n"), obfd);
1056     }
1057   else if (otype == bfd_link_hash_defined
1058 	   || otype == bfd_link_hash_defweak
1059 	   || otype == bfd_link_hash_indirect)
1060     {
1061       ASSERT (ntype == bfd_link_hash_common);
1062       einfo (_("%B: warning: common of `%T' overridden by definition\n"),
1063 	     nbfd, name);
1064       if (obfd != NULL)
1065 	einfo (_("%B: warning: defined here\n"), obfd);
1066     }
1067   else
1068     {
1069       ASSERT (otype == bfd_link_hash_common && ntype == bfd_link_hash_common);
1070       if (osize > nsize)
1071 	{
1072 	  einfo (_("%B: warning: common of `%T' overridden by larger common\n"),
1073 		 nbfd, name);
1074 	  if (obfd != NULL)
1075 	    einfo (_("%B: warning: larger common is here\n"), obfd);
1076 	}
1077       else if (nsize > osize)
1078 	{
1079 	  einfo (_("%B: warning: common of `%T' overriding smaller common\n"),
1080 		 nbfd, name);
1081 	  if (obfd != NULL)
1082 	    einfo (_("%B: warning: smaller common is here\n"), obfd);
1083 	}
1084       else
1085 	{
1086 	  einfo (_("%B: warning: multiple common of `%T'\n"), nbfd, name);
1087 	  if (obfd != NULL)
1088 	    einfo (_("%B: warning: previous common is here\n"), obfd);
1089 	}
1090     }
1091 
1092   return TRUE;
1093 }
1094 
1095 /* This is called when BFD has discovered a set element.  H is the
1096    entry in the linker hash table for the set.  SECTION and VALUE
1097    represent a value which should be added to the set.  */
1098 
1099 static bfd_boolean
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)1100 add_to_set (struct bfd_link_info *info ATTRIBUTE_UNUSED,
1101 	    struct bfd_link_hash_entry *h,
1102 	    bfd_reloc_code_real_type reloc,
1103 	    bfd *abfd,
1104 	    asection *section,
1105 	    bfd_vma value)
1106 {
1107   if (config.warn_constructors)
1108     einfo (_("%P: warning: global constructor %s used\n"),
1109 	   h->root.string);
1110 
1111   if (! config.build_constructors)
1112     return TRUE;
1113 
1114   ldctor_add_set_entry (h, reloc, NULL, section, value);
1115 
1116   if (h->type == bfd_link_hash_new)
1117     {
1118       h->type = bfd_link_hash_undefined;
1119       h->u.undef.abfd = abfd;
1120       /* We don't call bfd_link_add_undef to add this to the list of
1121 	 undefined symbols because we are going to define it
1122 	 ourselves.  */
1123     }
1124 
1125   return TRUE;
1126 }
1127 
1128 /* This is called when BFD has discovered a constructor.  This is only
1129    called for some object file formats--those which do not handle
1130    constructors in some more clever fashion.  This is similar to
1131    adding an element to a set, but less general.  */
1132 
1133 static bfd_boolean
constructor_callback(struct bfd_link_info * info,bfd_boolean constructor,const char * name,bfd * abfd,asection * section,bfd_vma value)1134 constructor_callback (struct bfd_link_info *info,
1135 		      bfd_boolean constructor,
1136 		      const char *name,
1137 		      bfd *abfd,
1138 		      asection *section,
1139 		      bfd_vma value)
1140 {
1141   char *s;
1142   struct bfd_link_hash_entry *h;
1143   char set_name[1 + sizeof "__CTOR_LIST__"];
1144 
1145   if (config.warn_constructors)
1146     einfo (_("%P: warning: global constructor %s used\n"), name);
1147 
1148   if (! config.build_constructors)
1149     return TRUE;
1150 
1151   /* Ensure that BFD_RELOC_CTOR exists now, so that we can give a
1152      useful error message.  */
1153   if (bfd_reloc_type_lookup (output_bfd, BFD_RELOC_CTOR) == NULL
1154       && (info->relocatable
1155 	  || bfd_reloc_type_lookup (abfd, BFD_RELOC_CTOR) == NULL))
1156     einfo (_("%P%F: BFD backend error: BFD_RELOC_CTOR unsupported\n"));
1157 
1158   s = set_name;
1159   if (bfd_get_symbol_leading_char (abfd) != '\0')
1160     *s++ = bfd_get_symbol_leading_char (abfd);
1161   if (constructor)
1162     strcpy (s, "__CTOR_LIST__");
1163   else
1164     strcpy (s, "__DTOR_LIST__");
1165 
1166   h = bfd_link_hash_lookup (info->hash, set_name, TRUE, TRUE, TRUE);
1167   if (h == (struct bfd_link_hash_entry *) NULL)
1168     einfo (_("%P%F: bfd_link_hash_lookup failed: %E\n"));
1169   if (h->type == bfd_link_hash_new)
1170     {
1171       h->type = bfd_link_hash_undefined;
1172       h->u.undef.abfd = abfd;
1173       /* We don't call bfd_link_add_undef to add this to the list of
1174 	 undefined symbols because we are going to define it
1175 	 ourselves.  */
1176     }
1177 
1178   ldctor_add_set_entry (h, BFD_RELOC_CTOR, name, section, value);
1179   return TRUE;
1180 }
1181 
1182 /* A structure used by warning_callback to pass information through
1183    bfd_map_over_sections.  */
1184 
1185 struct warning_callback_info
1186 {
1187   bfd_boolean found;
1188   const char *warning;
1189   const char *symbol;
1190   asymbol **asymbols;
1191 };
1192 
1193 /* This is called when there is a reference to a warning symbol.  */
1194 
1195 static bfd_boolean
warning_callback(struct bfd_link_info * info ATTRIBUTE_UNUSED,const char * warning,const char * symbol,bfd * abfd,asection * section,bfd_vma address)1196 warning_callback (struct bfd_link_info *info ATTRIBUTE_UNUSED,
1197 		  const char *warning,
1198 		  const char *symbol,
1199 		  bfd *abfd,
1200 		  asection *section,
1201 		  bfd_vma address)
1202 {
1203   /* This is a hack to support warn_multiple_gp.  FIXME: This should
1204      have a cleaner interface, but what?  */
1205   if (! config.warn_multiple_gp
1206       && strcmp (warning, "using multiple gp values") == 0)
1207     return TRUE;
1208 
1209   if (section != NULL)
1210     einfo ("%C: %s%s\n", abfd, section, address, _("warning: "), warning);
1211   else if (abfd == NULL)
1212     einfo ("%P: %s%s\n", _("warning: "), warning);
1213   else if (symbol == NULL)
1214     einfo ("%B: %s%s\n", abfd, _("warning: "), warning);
1215   else
1216     {
1217       lang_input_statement_type *entry;
1218       asymbol **asymbols;
1219       struct warning_callback_info info;
1220 
1221       /* Look through the relocs to see if we can find a plausible
1222 	 address.  */
1223       entry = (lang_input_statement_type *) abfd->usrdata;
1224       if (entry != NULL && entry->asymbols != NULL)
1225 	asymbols = entry->asymbols;
1226       else
1227 	{
1228 	  long symsize;
1229 	  long symbol_count;
1230 
1231 	  symsize = bfd_get_symtab_upper_bound (abfd);
1232 	  if (symsize < 0)
1233 	    einfo (_("%B%F: could not read symbols: %E\n"), abfd);
1234 	  asymbols = xmalloc (symsize);
1235 	  symbol_count = bfd_canonicalize_symtab (abfd, asymbols);
1236 	  if (symbol_count < 0)
1237 	    einfo (_("%B%F: could not read symbols: %E\n"), abfd);
1238 	  if (entry != NULL)
1239 	    {
1240 	      entry->asymbols = asymbols;
1241 	      entry->symbol_count = symbol_count;
1242 	    }
1243 	}
1244 
1245       info.found = FALSE;
1246       info.warning = warning;
1247       info.symbol = symbol;
1248       info.asymbols = asymbols;
1249       bfd_map_over_sections (abfd, warning_find_reloc, &info);
1250 
1251       if (! info.found)
1252 	einfo ("%B: %s%s\n", abfd, _("warning: "), warning);
1253 
1254       if (entry == NULL)
1255 	free (asymbols);
1256     }
1257 
1258   return TRUE;
1259 }
1260 
1261 /* This is called by warning_callback for each section.  It checks the
1262    relocs of the section to see if it can find a reference to the
1263    symbol which triggered the warning.  If it can, it uses the reloc
1264    to give an error message with a file and line number.  */
1265 
1266 static void
warning_find_reloc(bfd * abfd,asection * sec,void * iarg)1267 warning_find_reloc (bfd *abfd, asection *sec, void *iarg)
1268 {
1269   struct warning_callback_info *info = iarg;
1270   long relsize;
1271   arelent **relpp;
1272   long relcount;
1273   arelent **p, **pend;
1274 
1275   if (info->found)
1276     return;
1277 
1278   relsize = bfd_get_reloc_upper_bound (abfd, sec);
1279   if (relsize < 0)
1280     einfo (_("%B%F: could not read relocs: %E\n"), abfd);
1281   if (relsize == 0)
1282     return;
1283 
1284   relpp = xmalloc (relsize);
1285   relcount = bfd_canonicalize_reloc (abfd, sec, relpp, info->asymbols);
1286   if (relcount < 0)
1287     einfo (_("%B%F: could not read relocs: %E\n"), abfd);
1288 
1289   p = relpp;
1290   pend = p + relcount;
1291   for (; p < pend && *p != NULL; p++)
1292     {
1293       arelent *q = *p;
1294 
1295       if (q->sym_ptr_ptr != NULL
1296 	  && *q->sym_ptr_ptr != NULL
1297 	  && strcmp (bfd_asymbol_name (*q->sym_ptr_ptr), info->symbol) == 0)
1298 	{
1299 	  /* We found a reloc for the symbol we are looking for.  */
1300 	  einfo ("%C: %s%s\n", abfd, sec, q->address, _("warning: "),
1301 		 info->warning);
1302 	  info->found = TRUE;
1303 	  break;
1304 	}
1305     }
1306 
1307   free (relpp);
1308 }
1309 
1310 /* This is called when an undefined symbol is found.  */
1311 
1312 static bfd_boolean
undefined_symbol(struct bfd_link_info * info ATTRIBUTE_UNUSED,const char * name,bfd * abfd,asection * section,bfd_vma address,bfd_boolean error)1313 undefined_symbol (struct bfd_link_info *info ATTRIBUTE_UNUSED,
1314 		  const char *name,
1315 		  bfd *abfd,
1316 		  asection *section,
1317 		  bfd_vma address,
1318 		  bfd_boolean error)
1319 {
1320   static char *error_name;
1321   static unsigned int error_count;
1322 
1323 #define MAX_ERRORS_IN_A_ROW 5
1324 
1325   if (config.warn_once)
1326     {
1327       static struct bfd_hash_table *hash;
1328 
1329       /* Only warn once about a particular undefined symbol.  */
1330       if (hash == NULL)
1331 	{
1332 	  hash = xmalloc (sizeof (struct bfd_hash_table));
1333 	  if (! bfd_hash_table_init (hash, bfd_hash_newfunc))
1334 	    einfo (_("%F%P: bfd_hash_table_init failed: %E\n"));
1335 	}
1336 
1337       if (bfd_hash_lookup (hash, name, FALSE, FALSE) != NULL)
1338 	return TRUE;
1339 
1340       if (bfd_hash_lookup (hash, name, TRUE, TRUE) == NULL)
1341 	einfo (_("%F%P: bfd_hash_lookup failed: %E\n"));
1342     }
1343 
1344   /* We never print more than a reasonable number of errors in a row
1345      for a single symbol.  */
1346   if (error_name != NULL
1347       && strcmp (name, error_name) == 0)
1348     ++error_count;
1349   else
1350     {
1351       error_count = 0;
1352       if (error_name != NULL)
1353 	free (error_name);
1354       error_name = xstrdup (name);
1355     }
1356 
1357   if (section != NULL)
1358     {
1359       if (error_count < MAX_ERRORS_IN_A_ROW)
1360 	{
1361 	  if (error)
1362 	    einfo (_("%X%C: undefined reference to `%T'\n"),
1363 		   abfd, section, address, name);
1364 	  else
1365 	    einfo (_("%C: warning: undefined reference to `%T'\n"),
1366 		   abfd, section, address, name);
1367 	}
1368       else if (error_count == MAX_ERRORS_IN_A_ROW)
1369 	{
1370 	  if (error)
1371 	    einfo (_("%X%D: more undefined references to `%T' follow\n"),
1372 		   abfd, section, address, name);
1373 	  else
1374 	    einfo (_("%D: warning: more undefined references to `%T' follow\n"),
1375 		   abfd, section, address, name);
1376 	}
1377       else if (error)
1378 	einfo ("%X");
1379     }
1380   else
1381     {
1382       if (error_count < MAX_ERRORS_IN_A_ROW)
1383 	{
1384 	  if (error)
1385 	    einfo (_("%X%B: undefined reference to `%T'\n"),
1386 		   abfd, name);
1387 	  else
1388 	    einfo (_("%B: warning: undefined reference to `%T'\n"),
1389 		   abfd, name);
1390 	}
1391       else if (error_count == MAX_ERRORS_IN_A_ROW)
1392 	{
1393 	  if (error)
1394 	    einfo (_("%X%B: more undefined references to `%T' follow\n"),
1395 		   abfd, name);
1396 	  else
1397 	    einfo (_("%B: warning: more undefined references to `%T' follow\n"),
1398 		   abfd, name);
1399 	}
1400       else if (error)
1401 	einfo ("%X");
1402     }
1403 
1404   return TRUE;
1405 }
1406 
1407 /* Counter to limit the number of relocation overflow error messages
1408    to print.  Errors are printed as it is decremented.  When it's
1409    called and the counter is zero, a final message is printed
1410    indicating more relocations were omitted.  When it gets to -1, no
1411    such errors are printed.  If it's initially set to a value less
1412    than -1, all such errors will be printed (--verbose does this).  */
1413 
1414 int overflow_cutoff_limit = 10;
1415 
1416 /* This is called when a reloc overflows.  */
1417 
1418 static bfd_boolean
reloc_overflow(struct bfd_link_info * info ATTRIBUTE_UNUSED,struct bfd_link_hash_entry * entry,const char * name,const char * reloc_name,bfd_vma addend,bfd * abfd,asection * section,bfd_vma address)1419 reloc_overflow (struct bfd_link_info *info ATTRIBUTE_UNUSED,
1420 		struct bfd_link_hash_entry *entry,
1421 		const char *name,
1422 		const char *reloc_name,
1423 		bfd_vma addend,
1424 		bfd *abfd,
1425 		asection *section,
1426 		bfd_vma address)
1427 {
1428   if (overflow_cutoff_limit == -1)
1429     return TRUE;
1430 
1431   einfo ("%X%C:", abfd, section, address);
1432 
1433   if (overflow_cutoff_limit >= 0
1434       && overflow_cutoff_limit-- == 0)
1435     {
1436       einfo (_(" additional relocation overflows omitted from the output\n"));
1437       return TRUE;
1438     }
1439 
1440   if (entry)
1441     {
1442       while (entry->type == bfd_link_hash_indirect
1443 	     || entry->type == bfd_link_hash_warning)
1444 	entry = entry->u.i.link;
1445       switch (entry->type)
1446 	{
1447 	case bfd_link_hash_undefined:
1448 	case bfd_link_hash_undefweak:
1449 	  einfo (_(" relocation truncated to fit: %s against undefined symbol `%T'"),
1450 		 reloc_name, entry->root.string);
1451 	  break;
1452 	case bfd_link_hash_defined:
1453 	case bfd_link_hash_defweak:
1454 	  einfo (_(" relocation truncated to fit: %s against symbol `%T' defined in %A section in %B"),
1455 		 reloc_name, entry->root.string,
1456 		 entry->u.def.section,
1457 		 entry->u.def.section == bfd_abs_section_ptr
1458 		 ? output_bfd : entry->u.def.section->owner);
1459 	  break;
1460 	default:
1461 	  abort ();
1462 	  break;
1463 	}
1464     }
1465   else
1466     einfo (_(" relocation truncated to fit: %s against `%T'"),
1467 	   reloc_name, name);
1468   if (addend != 0)
1469     einfo ("+%v", addend);
1470   einfo ("\n");
1471   return TRUE;
1472 }
1473 
1474 /* This is called when a dangerous relocation is made.  */
1475 
1476 static bfd_boolean
reloc_dangerous(struct bfd_link_info * info ATTRIBUTE_UNUSED,const char * message,bfd * abfd,asection * section,bfd_vma address)1477 reloc_dangerous (struct bfd_link_info *info ATTRIBUTE_UNUSED,
1478 		 const char *message,
1479 		 bfd *abfd,
1480 		 asection *section,
1481 		 bfd_vma address)
1482 {
1483   einfo (_("%X%C: dangerous relocation: %s\n"),
1484 	 abfd, section, address, message);
1485   return TRUE;
1486 }
1487 
1488 /* This is called when a reloc is being generated attached to a symbol
1489    that is not being output.  */
1490 
1491 static bfd_boolean
unattached_reloc(struct bfd_link_info * info ATTRIBUTE_UNUSED,const char * name,bfd * abfd,asection * section,bfd_vma address)1492 unattached_reloc (struct bfd_link_info *info ATTRIBUTE_UNUSED,
1493 		  const char *name,
1494 		  bfd *abfd,
1495 		  asection *section,
1496 		  bfd_vma address)
1497 {
1498   einfo (_("%X%C: reloc refers to symbol `%T' which is not being output\n"),
1499 	 abfd, section, address, name);
1500   return TRUE;
1501 }
1502 
1503 /* This is called if link_info.notice_all is set, or when a symbol in
1504    link_info.notice_hash is found.  Symbols are put in notice_hash
1505    using the -y option.  */
1506 
1507 static bfd_boolean
notice(struct bfd_link_info * info,const char * name,bfd * abfd,asection * section,bfd_vma value)1508 notice (struct bfd_link_info *info,
1509 	const char *name,
1510 	bfd *abfd,
1511 	asection *section,
1512 	bfd_vma value)
1513 {
1514   if (! info->notice_all
1515       || (info->notice_hash != NULL
1516 	  && bfd_hash_lookup (info->notice_hash, name, FALSE, FALSE) != NULL))
1517     {
1518       if (bfd_is_und_section (section))
1519 	einfo ("%B: reference to %s\n", abfd, name);
1520       else
1521 	einfo ("%B: definition of %s\n", abfd, name);
1522     }
1523 
1524   if (command_line.cref || nocrossref_list != NULL)
1525     add_cref (name, abfd, section, value);
1526 
1527   return TRUE;
1528 }
1529