[binutils-gdb] Re: Another fix for EFI generation with LTO enabled

Alan Modra amodra@sourceware.org
Tue Jan 31 11:23:24 GMT 2023


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=081609f5ff3e7d469b9ea7621d924504c4e3c3b2

commit 081609f5ff3e7d469b9ea7621d924504c4e3c3b2
Author: Alan Modra <amodra@gmail.com>
Date:   Tue Jan 31 21:48:58 2023 +1030

    Re: Another fix for EFI generation with LTO enabled
    
    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.

Diff:
---
 ld/ldlang.c |  2 ++
 ld/pe-dll.c | 16 ----------------
 2 files changed, 2 insertions(+), 16 deletions(-)

diff --git a/ld/ldlang.c b/ld/ldlang.c
index b66d8c6bc1d..84a2914fc26 100644
--- a/ld/ldlang.c
+++ b/ld/ldlang.c
@@ -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);
diff --git a/ld/pe-dll.c b/ld/pe-dll.c
index 49544babf11..2956eef1ca9 100644
--- a/ld/pe-dll.c
+++ b/ld/pe-dll.c
@@ -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);
 }


More information about the Binutils-cvs mailing list