Re: Another fix for EFI generation with LTO enabled
authorAlan Modra <amodra@gmail.com>
Tue, 31 Jan 2023 11:18:58 +0000 (21:48 +1030)
committerAlan Modra <amodra@gmail.com>
Tue, 31 Jan 2023 11:21:09 +0000 (21:51 +1030)
Revert 1c66b8a03989 and instead fix the broken list pointer.

PR 29998
* pe-dll.c (build_filler_bfd): Revert last change.
* ldlang.c (lang_process): When rescanning archives for lto,
fix file_chain.tail pointer if the insert point happens to be
at the end of the list.

ld/ldlang.c
ld/pe-dll.c

index b66d8c6bc1dd8c9bcb8f142c7111307513098588..84a2914fc2641ad9f13ab6c6dd39b4f2fe0f8291 100644 (file)
@@ -8017,6 +8017,8 @@ lang_process (void)
              *insert = &files.head->input_statement;
              files.head = (lang_statement_union_type *) *iter;
              *iter = temp;
+             if (file_chain.tail == (lang_statement_union_type **) insert)
+               file_chain.tail = (lang_statement_union_type **) iter;
              if (my_arch != NULL)
                {
                  lang_input_statement_type *parent = bfd_usrdata (my_arch);
index 49544babf11cf8bb1d97fbb6575692d6eb60658c..2956eef1ca91680ff86267fee418d3ce91c19bcb 100644 (file)
@@ -1082,22 +1082,6 @@ build_filler_bfd (bool include_edata)
 
   bfd_set_section_size (reloc_s, 0);
 
-  /* FIXME: I am not sure if this is the right way to solve PR 29998.
-     It might be better to change ldlang.c:lang_statement_append() so that it
-     checks to see if *(list->tail) is non-NULL and if so, set element->next
-     to its contents.
-
-     The issue is that this function is called after lang_process().
-     lang_process () will have gone through any input archives, and if the
-     last input file is an archive then it will have left file_chain.tail
-     pointing to the last used element of that archive.  Calling
-     ldlang_add_file() here then blows aaway the link to that archive element,
-     effectively deleting it from the input.  In order to prevent this, the
-     assignment below fills in the next field of the statement that is about
-     to appended to the file chain.  */
-  if (file_chain.tail != NULL)
-    filler_file->next = & (* file_chain.tail)->input_statement;
-
   ldlang_add_file (filler_file);
 }