From d580dcc7aac21dc8396e8e90ea6d05ec32d6cbb9 Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Sun, 28 Jan 2018 08:03:26 +1030 Subject: [PATCH] PR22751, LTO broken for libgcc libcalls So what was happening was that the file added from libgcc.a during the rescan was not put on file_chain. map_input_to_output_sections then doesn't see the file and its sections are treated as discarded. The file_chain list pointer bug was caused by that fact that an archive element claimed by the plugin does not have my_archive set. Or more correctly, the actual archive element does have my_archive set, but this bfd is replaced with a dummy bfd that doesn't have my_archive set. PR 22751 * ldlang.c (find_rescan_insertion): Look past bfds with claim_archive set. --- ld/ChangeLog | 6 ++++++ ld/ldlang.c | 3 ++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/ld/ChangeLog b/ld/ChangeLog index 3430a86d432..f32b42fa904 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,9 @@ +2018-01-28 Alan Modra + + PR 22751 + * ldlang.c (find_rescan_insertion): Look past bfds with claim_archive + set. + 2018-01-26 Maciej W. Rozycki * emulparams/elf32mipswindiss.sh (EXTRA_EM_FILE): Set to diff --git a/ld/ldlang.c b/ld/ldlang.c index 1526d7b2ec1..001039d68bb 100644 --- a/ld/ldlang.c +++ b/ld/ldlang.c @@ -7044,7 +7044,8 @@ find_rescan_insertion (lang_input_statement_type *add) for (iter = before ? &before->next : &file_chain.head->input_statement.next; *iter != NULL; iter = &(*iter)->input_statement.next) - if ((*iter)->input_statement.the_bfd->my_archive == NULL) + if (!(*iter)->input_statement.flags.claim_archive + && (*iter)->input_statement.the_bfd->my_archive == NULL) break; return iter; -- 2.30.2