/* Main program of GNU linker.
- Copyright (C) 1991-2018 Free Software Foundation, Inc.
+ Copyright (C) 1991-2020 Free Software Foundation, Inc.
Written by Steve Chamberlain steve@cygnus.com
This file is part of the GNU Binutils.
#include "libiberty.h"
#include "progress.h"
#include "bfdlink.h"
+#include "ctf-api.h"
#include "filenames.h"
#include "ld.h"
int g_switch_value = 8;
/* Nonzero means print names of input files as processed. */
-bfd_boolean trace_files;
+unsigned int trace_files;
/* Nonzero means report actions taken by the linker, and describe the linker script in use. */
bfd_boolean verbose;
einfo,
info_msg,
minfo,
- ldlang_override_segment_assignment
+ ldlang_override_segment_assignment,
+ ldlang_ctf_apply_strsym,
+ ldlang_write_ctf_late
};
static bfd_assert_handler_type default_bfd_assert_handler;
expandargv (&argc, &argv);
- bfd_init ();
+ if (bfd_init () != BFD_INIT_MAGIC)
+ einfo (_("%F%P: fatal error: libbfd ABI mismatch\n"));
bfd_set_error_program_name (program_name);
config.make_executable = TRUE;
config.magic_demand_paged = TRUE;
config.text_read_only = TRUE;
+ config.print_map_discarded = TRUE;
link_info.disable_target_specific_optimizations = -1;
command_line.warn_mismatch = TRUE;
link_info.keep_memory = TRUE;
link_info.combreloc = TRUE;
link_info.strip_discarded = TRUE;
+ link_info.prohibit_multiple_definition_absolute = FALSE;
link_info.emit_hash = DEFAULT_EMIT_SYSV_HASH;
link_info.emit_gnu_hash = DEFAULT_EMIT_GNU_HASH;
link_info.callbacks = &link_callbacks;
emulation = get_emulation (argc, argv);
ldemul_choose_mode (emulation);
default_target = ldemul_choose_target (argc, argv);
- config.maxpagesize = bfd_emul_get_maxpagesize (default_target);
- config.commonpagesize = bfd_emul_get_commonpagesize (default_target);
lang_init ();
ldexp_init ();
ldemul_before_parse ();
if (saved_script_handle == NULL
&& command_line.default_script != NULL)
{
- ldfile_open_command_file (command_line.default_script);
+ ldfile_open_script_file (command_line.default_script);
parser_input = input_script;
yyparse ();
}
einfo (_("%F%P: no input files\n"));
}
- if (trace_files)
+ if (verbose)
info_msg (_("%P: mode %s\n"), emulation);
ldemul_after_parse ();
config.map_filename);
}
}
+ link_info.has_map_file = TRUE;
}
lang_process ();
want to ignore for relocatable output?) */
if (!config.make_executable && !force_make_executable)
{
- if (trace_files)
+ if (verbose)
einfo (_("%P: link errors found, deleting executable `%s'\n"),
output_filename);
get_sysroot (int argc, char **argv)
{
int i;
- const char *path;
+ const char *path = NULL;
for (i = 1; i < argc; i++)
if (CONST_STRNEQ (argv[i], "--sysroot="))
- return argv[i] + strlen ("--sysroot=");
+ path = argv[i] + strlen ("--sysroot=");
- path = get_relative_sysroot (BINDIR);
- if (path)
- return path;
+ if (!path)
+ path = get_relative_sysroot (BINDIR);
- path = get_relative_sysroot (TOOLBINDIR);
- if (path)
- return path;
+ if (!path)
+ path = get_relative_sysroot (TOOLBINDIR);
+
+ if (!path)
+ path = TARGET_SYSTEM_ROOT;
+
+ if (IS_DIR_SEPARATOR (*path) && path[1] == 0)
+ path = "";
- return TARGET_SYSTEM_ROOT;
+ return path;
}
/* We need to find any explicitly given emulation in order to initialize the
input->local_sym_name = abfd->filename;
input->the_bfd = abfd;
- parent = abfd->my_archive->usrdata;
+ parent = bfd_usrdata (abfd->my_archive);
if (parent != NULL && !parent->flags.reload)
- parent->next = (lang_statement_union_type *) input;
+ parent->next = input;
/* Save the original data for trace files/tries below, as plugins
(if enabled) may possibly alter it to point to a replacement
{
/* Don't claim new IR symbols after all IR symbols have
been claimed. */
- if (trace_files || verbose)
+ if (verbose)
info_msg ("%pI: no new IR symbols to claimi\n",
&orig_input);
input->flags.claimed = 0;
int len;
h = bfd_link_hash_lookup (info->hash, name, FALSE, FALSE, TRUE);
+ if (h == NULL
+ && info->pei386_auto_import
+ && CONST_STRNEQ (name, "__imp_"))
+ h = bfd_link_hash_lookup (info->hash, name + 6, FALSE, FALSE, TRUE);
if (h == NULL)
from = NULL;
minfo ("(%s)\n", name);
}
- if (trace_files || verbose)
+ if (verbose
+ || trace_files > 1
+ || (trace_files && bfd_is_thin_archive (orig_input.the_bfd->my_archive)))
info_msg ("%pI\n", &orig_input);
return TRUE;
}
discarded, and this is not really a multiple definition at all.
FIXME: It would be cleaner to somehow ignore symbols defined in
sections which are being discarded. */
- if ((osec->output_section != NULL
- && !bfd_is_abs_section (osec)
- && bfd_is_abs_section (osec->output_section))
- || (nsec->output_section != NULL
- && !bfd_is_abs_section (nsec)
- && bfd_is_abs_section (nsec->output_section)))
+ if (!info->prohibit_multiple_definition_absolute
+ && ((osec->output_section != NULL
+ && ! bfd_is_abs_section (osec)
+ && bfd_is_abs_section (osec->output_section))
+ || (nsec->output_section != NULL
+ && !bfd_is_abs_section (nsec)
+ && bfd_is_abs_section (nsec->output_section))))
return;
name = h->root.string;
if (overflow_cutoff_limit == -1)
return;
- einfo ("%X%P: %H:", abfd, section, address);
+ einfo ("%X%H:", abfd, section, address);
if (overflow_cutoff_limit >= 0
&& overflow_cutoff_limit-- == 0)
asection *section,
bfd_vma address)
{
- einfo (_("%X%P: %H: dangerous relocation: %s\n"),
+ einfo (_("%X%H: dangerous relocation: %s\n"),
abfd, section, address, message);
}
asection *section,
bfd_vma address)
{
- einfo (_("%X%P: %H: reloc refers to symbol `%pT' which is not being output\n"),
+ einfo (_("%X%H: reloc refers to symbol `%pT' which is not being output\n"),
abfd, section, address, name);
}