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