/* Main program of GNU linker.
- Copyright (C) 1991-2014 Free Software Foundation, Inc.
+ Copyright (C) 1991-2016 Free Software Foundation, Inc.
Written by Steve Chamberlain steve@cygnus.com
This file is part of the GNU Binutils.
#ifdef ENABLE_PLUGINS
#include "plugin.h"
#include "plugin-api.h"
-#include "libbfd.h"
#endif /* ENABLE_PLUGINS */
/* Somewhere above, sys/stat.h got included. */
/* Set up the sysroot directory. */
ld_sysroot = get_sysroot (argc, argv);
if (*ld_sysroot)
- {
- if (*TARGET_SYSTEM_ROOT == 0)
- {
- einfo ("%P%F: this linker was not configured to use sysroots\n");
- ld_sysroot = "";
- }
- else
- ld_canon_sysroot = lrealpath (ld_sysroot);
- }
+ ld_canon_sysroot = lrealpath (ld_sysroot);
if (ld_canon_sysroot)
ld_canon_sysroot_len = strlen (ld_canon_sysroot);
else
link_info.init_function = "_init";
link_info.fini_function = "_fini";
link_info.relax_pass = 1;
+ link_info.extern_protected_data = -1;
link_info.pei386_auto_import = -1;
link_info.spare_dynamic_tags = 5;
link_info.path_separator = ':';
+#ifdef DEFAULT_FLAG_COMPRESS_DEBUG
+ link_info.compress_debug = COMPRESS_DEBUG_GABI_ZLIB;
+#endif
ldfile_add_arch ("");
emulation = get_emulation (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 ();
lang_has_input_file = FALSE;
parse_args (argc, argv);
/* Print error messages for any missing symbols, for any warning
symbols, and possibly multiple definitions. */
- if (link_info.relocatable)
+ if (bfd_link_relocatable (&link_info))
link_info.output_bfd->flags &= ~EXEC_P;
else
link_info.output_bfd->flags |= EXEC_P;
+ if ((link_info.compress_debug & COMPRESS_DEBUG))
+ {
+ link_info.output_bfd->flags |= BFD_COMPRESS;
+ if (link_info.compress_debug == COMPRESS_DEBUG_GABI_ZLIB)
+ link_info.output_bfd->flags |= BFD_COMPRESS_GABI;
+ }
+
ldwrite ();
if (config.map_file != NULL)
output_cref (config.map_file != NULL ? config.map_file : stdout);
if (nocrossref_list != NULL)
check_nocrossrefs ();
+ if (command_line.print_memory_usage)
+ lang_print_memory_usage ();
#if 0
{
struct bfd_link_hash_entry * h;
fprintf (stderr, "lookup = %p val %lx\n", h, h ? h->u.def.value : 1);
}
#endif
+ ldexp_finish ();
lang_finish ();
/* Even if we're producing relocatable output, some non-fatal errors should
/* If the --force-exe-suffix is enabled, and we're making an
executable file and it doesn't end in .exe, copy it to one
which does. */
- if (! link_info.relocatable && command_line.force_exe_suffix)
+ if (!bfd_link_relocatable (&link_info)
+ && command_line.force_exe_suffix)
{
int len = strlen (output_filename);
dst = fopen (dst_name, FOPEN_WB);
if (!src)
- einfo (_("%X%P: unable to open for source of copy `%s'\n"),
+ einfo (_("%P%F: unable to open for source of copy `%s'\n"),
output_filename);
if (!dst)
- einfo (_("%X%P: unable to open for destination of copy `%s'\n"),
+ einfo (_("%P%F: unable to open for destination of copy `%s'\n"),
dst_name);
while ((l = fread (buf, 1, bsize, src)) > 0)
{
BFD, but we still want to output the original BFD filename. */
orig_input = *input;
#ifdef ENABLE_PLUGINS
- if (plugin_active_plugins_p () && !no_more_claiming)
+ if (link_info.lto_plugin_active && !no_more_claiming)
{
/* We must offer this archive member to the plugins to claim. */
- const char *filename = (bfd_my_archive (abfd) != NULL
- ? bfd_my_archive (abfd)->filename : abfd->filename);
- int fd = open (filename, O_RDONLY | O_BINARY);
- if (fd >= 0)
+ plugin_maybe_claim (input);
+ if (input->flags.claimed)
{
- struct ld_plugin_input_file file;
-
- /* Offset and filesize must refer to the individual archive
- member, not the whole file, and must exclude the header.
- Fortunately for us, that is how the data is stored in the
- origin field of the bfd and in the arelt_data. */
- file.name = filename;
- file.offset = abfd->origin;
- file.filesize = arelt_size (abfd);
- file.fd = fd;
- plugin_maybe_claim (&file, input);
- if (input->flags.claimed)
- {
- input->flags.claim_archive = TRUE;
- *subsbfd = input->the_bfd;
- }
+ input->flags.claim_archive = TRUE;
+ *subsbfd = input->the_bfd;
}
}
#endif /* ENABLE_PLUGINS */
/* Ensure that BFD_RELOC_CTOR exists now, so that we can give a
useful error message. */
if (bfd_reloc_type_lookup (info->output_bfd, BFD_RELOC_CTOR) == NULL
- && (info->relocatable
+ && (bfd_link_relocatable (info)
|| bfd_reloc_type_lookup (abfd, BFD_RELOC_CTOR) == NULL))
einfo (_("%P%F: BFD backend error: BFD_RELOC_CTOR unsupported\n"));