aboutsummaryrefslogtreecommitdiff
path: root/ld/ldlang.c
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2018-01-28 08:03:26 +1030
committerAlan Modra <amodra@gmail.com>2018-01-28 08:29:55 +1030
commitd580dcc7aac21dc8396e8e90ea6d05ec32d6cbb9 (patch)
tree9b38fe49bda78422d8c63b8bf19818ce977a5100 /ld/ldlang.c
parent9a5db26e6d9494e8285d4c177ee3d32292c7a35e (diff)
downloadfsf-binutils-gdb-d580dcc7aac21dc8396e8e90ea6d05ec32d6cbb9.zip
fsf-binutils-gdb-d580dcc7aac21dc8396e8e90ea6d05ec32d6cbb9.tar.gz
fsf-binutils-gdb-d580dcc7aac21dc8396e8e90ea6d05ec32d6cbb9.tar.bz2
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.
Diffstat (limited to 'ld/ldlang.c')
-rw-r--r--ld/ldlang.c3
1 files changed, 2 insertions, 1 deletions
diff --git a/ld/ldlang.c b/ld/ldlang.c
index 1526d7b..001039d 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;