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