diff options
author | Alan Modra <amodra@gmail.com> | 2015-02-14 18:38:32 +1030 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2015-02-14 23:41:54 +1030 |
commit | ce875075f9c8acc57bb0ec516ae3ba50064e52b7 (patch) | |
tree | e3957d0a0a9b9931194f532155acd9386bcc71a3 /ld | |
parent | 0a60f874dc25306c48fab8f7655813eb1bfeca8f (diff) | |
download | gdb-ce875075f9c8acc57bb0ec516ae3ba50064e52b7.zip gdb-ce875075f9c8acc57bb0ec516ae3ba50064e52b7.tar.gz gdb-ce875075f9c8acc57bb0ec516ae3ba50064e52b7.tar.bz2 |
PR ld/17973 LTO file syms
LTO output objects have an STT_FILE symbol using the name of the file,
a temporary file. This results in executables that can't be exactly
reproduced, so the file name needs to be dropped. We don't want to
lose all file symbols when linking a mix of lto and non-lto objects as
a file symbol can be used to figure which source file generated a
given local symbol. So lto output objects need to be marked.
I chose to mark lto output objects with a new bfd flag. This flag is
also used to fix a bug in the link-once handling; An object being
loaded after "loading_lto_outputs" is set might be one extracted from
an archive to satisfy new references from lto objects, not an lto
object itself.
The new flag is copied from archive to elements, and the same done
for no_export. This fixes a bug in that --exclude-libs doesn't work
with thin archives. I'm not completely happy with this part of the
patch and may revist this to avoid the hack in
_bfd_look_for_bfd_in_cache.
PR ld/17973
include/
* bfdlink.h (struct bfd_link_info): Delete loading_lto_outputs.
bfd/
* bfd.c (struct bfd): Add lto_output.
* linker.c (_bfd_handle_already_linked): Explicitly test for
objects added by the lto plugin.
* opncls.c (_bfd_new_bfd_contained_in): Copy lto_output and
no_export flags from archive.
* archive.c (open_nested_file): New function, setting lto_output
and no_export, extracted from..
(find_nested_archive): ..here. Flip params. Rename from
_bfd_find_nested_archive.
(_bfd_get_elt_at_filepos): Correct var typo. Use open_nested_file.
(_bfd_look_for_bfd_in_cache): Copy no_export.
* elflink.c (elf_link_add_object_symbols): Remove now unnecessary
my_archive->no_export test.
(elf_link_input_bfd): Drop existing lto_output STT_FILE syms.
Don't use the file name when adding lto_output STT_FILE sym.
* bfd-in2.h: Regenerate.
ld/
* ldlang.h (struct lang_input_statement_flags): Add lto_output.
* ldlang.c (lang_process): Don't set loading_lto_outputs.
* ldfile.c (ldfile_try_open_bfd): Transfer entry flags.lto_output
to bfd.
* plugin.c (add_input_file, add_input_library): Set flags.lto_output.
Diffstat (limited to 'ld')
-rw-r--r-- | ld/ChangeLog | 9 | ||||
-rw-r--r-- | ld/ldfile.c | 5 | ||||
-rw-r--r-- | ld/ldlang.c | 1 | ||||
-rw-r--r-- | ld/ldlang.h | 3 | ||||
-rw-r--r-- | ld/plugin.c | 16 |
5 files changed, 29 insertions, 5 deletions
diff --git a/ld/ChangeLog b/ld/ChangeLog index c30426d..4803ec3 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,12 @@ +2015-02-14 Alan Modra <amodra@gmail.com> + + PR ld/17973 + * ldlang.h (struct lang_input_statement_flags): Add lto_output. + * ldlang.c (lang_process): Don't set loading_lto_outputs. + * ldfile.c (ldfile_try_open_bfd): Transfer entry flags.lto_output + to bfd. + * plugin.c (add_input_file, add_input_library): Set flags.lto_output. + 2015-02-13 H.J. Lu <hongjiu.lu@intel.com> * NEWS: Mention support for LLVM plugin. diff --git a/ld/ldfile.c b/ld/ldfile.c index e19f55e..21bdbf4 100644 --- a/ld/ldfile.c +++ b/ld/ldfile.c @@ -142,6 +142,11 @@ ldfile_try_open_bfd (const char *attempt, /* Linker needs to decompress sections. */ entry->the_bfd->flags |= BFD_DECOMPRESS; +#ifdef ENABLE_PLUGINS + if (entry->flags.lto_output) + entry->the_bfd->lto_output = 1; +#endif + /* If we are searching for this file, see if the architecture is compatible with the output file. If it isn't, keep searching. If we can't open the file as an object file, stop the search diff --git a/ld/ldlang.c b/ld/ldlang.c index 5c4581f..ce333b4 100644 --- a/ld/ldlang.c +++ b/ld/ldlang.c @@ -6643,7 +6643,6 @@ lang_process (void) einfo (_("%P%F: %s: plugin reported error after all symbols read\n"), plugin_error_plugin ()); /* Open any newly added files, updating the file chains. */ - link_info.loading_lto_outputs = TRUE; open_input_bfds (*added.tail, OPEN_BFD_NORMAL); /* Restore the global list pointer now they have all been added. */ lang_list_remove_tail (stat_ptr, &added); diff --git a/ld/ldlang.h b/ld/ldlang.h index 69d21a7..7cb7610 100644 --- a/ld/ldlang.h +++ b/ld/ldlang.h @@ -283,6 +283,9 @@ struct lang_input_statement_flags /* Set if the file was claimed from an archive. */ unsigned int claim_archive : 1; + + /* Set if added by the lto plugin add_input_file callback. */ + unsigned int lto_output : 1; #endif /* ENABLE_PLUGINS */ /* Head of list of pushed flags. */ diff --git a/ld/plugin.c b/ld/plugin.c index 4fee305..31527ae 100644 --- a/ld/plugin.c +++ b/ld/plugin.c @@ -772,10 +772,14 @@ get_symbols_v2 (const void *handle, int nsyms, struct ld_plugin_symbol *syms) static enum ld_plugin_status add_input_file (const char *pathname) { + lang_input_statement_type *is; + ASSERT (called_plugin); - if (!lang_add_input_file (xstrdup (pathname), lang_input_file_is_file_enum, - NULL)) + is = lang_add_input_file (xstrdup (pathname), lang_input_file_is_file_enum, + NULL); + if (!is) return LDPS_ERR; + is->flags.lto_output = 1; return LDPS_OK; } @@ -783,10 +787,14 @@ add_input_file (const char *pathname) static enum ld_plugin_status add_input_library (const char *pathname) { + lang_input_statement_type *is; + ASSERT (called_plugin); - if (!lang_add_input_file (xstrdup (pathname), lang_input_file_is_l_enum, - NULL)) + is = lang_add_input_file (xstrdup (pathname), lang_input_file_is_l_enum, + NULL); + if (!is) return LDPS_ERR; + is->flags.lto_output = 1; return LDPS_OK; } |