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