]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
PR22751, LTO broken for libgcc libcalls
authorAlan Modra <amodra@gmail.com>
Sat, 27 Jan 2018 21:33:26 +0000 (08:03 +1030)
committerAlan Modra <amodra@gmail.com>
Sat, 27 Jan 2018 21:59:55 +0000 (08:29 +1030)
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
ld/ldlang.c

index 3430a86d432dc626746d14a33b3f19f406321ae8..f32b42fa904c6ffee26444e590404eae75704d57 100644 (file)
@@ -1,3 +1,9 @@
+2018-01-28  Alan Modra  <amodra@gmail.com>
+
+       PR 22751
+       * ldlang.c (find_rescan_insertion): Look past bfds with claim_archive
+       set.
+
 2018-01-26  Maciej W. Rozycki  <macro@mips.com>
 
        * emulparams/elf32mipswindiss.sh (EXTRA_EM_FILE): Set to
index 1526d7b2ec163a0ca1a3ec9b6ef6e411ec2a33f1..001039d68bb903952a8a974bb2dd0a76b292bbaa 100644 (file)
@@ -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;