X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=ld%2Fldmain.c;h=21133ab72090a6e2f8fcb80a2c11f40f8fc12fb0;hb=aec6b87e0b66d707ead62ca40d220ee78b4cf5a5;hp=a6207c66233d4bf63aa5f0a354dc962e0515a979;hpb=b90efa5b79ac1524ec260f8eb89d1be37e0219a7;p=deliverable%2Fbinutils-gdb.git diff --git a/ld/ldmain.c b/ld/ldmain.c index a6207c6623..21133ab720 100644 --- a/ld/ldmain.c +++ b/ld/ldmain.c @@ -1,5 +1,5 @@ /* Main program of GNU linker. - Copyright (C) 1991-2015 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. @@ -41,7 +41,6 @@ #ifdef ENABLE_PLUGINS #include "plugin.h" #include "plugin-api.h" -#include "libbfd.h" #endif /* ENABLE_PLUGINS */ /* Somewhere above, sys/stat.h got included. */ @@ -223,15 +222,7 @@ main (int argc, char **argv) /* 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 @@ -286,9 +277,14 @@ main (int argc, char **argv) link_info.init_function = "_init"; link_info.fini_function = "_fini"; link_info.relax_pass = 1; + link_info.extern_protected_data = -1; + link_info.dynamic_undefined_weak = -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); @@ -420,11 +416,18 @@ main (int argc, char **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) @@ -433,6 +436,8 @@ main (int argc, char **argv) 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; @@ -464,7 +469,8 @@ main (int argc, char **argv) /* 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); @@ -485,10 +491,10 @@ main (int argc, char **argv) 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) { @@ -790,30 +796,14 @@ add_archive_element (struct bfd_link_info *info, 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 */ @@ -1129,7 +1119,7 @@ constructor_callback (struct bfd_link_info *info, /* 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"));