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