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