[lld] f456c3a - [ELF] Move addWrappedSymbols before postParseObjectFile

Fangrui Song via llvm-commits llvm-commits at lists.llvm.org
Fri Mar 4 18:56:42 PST 2022


Author: Fangrui Song
Date: 2022-03-04T18:56:37-08:00
New Revision: f456c3ae3f4182b23673929e8fe0aa18bcec4289

URL: https://github.com/llvm/llvm-project/commit/f456c3ae3f4182b23673929e8fe0aa18bcec4289
DIFF: https://github.com/llvm/llvm-project/commit/f456c3ae3f4182b23673929e8fe0aa18bcec4289.diff

LOG: [ELF] Move addWrappedSymbols before postParseObjectFile

addWrappedSymbols may trigger archive extraction: split stack implementation
uses --wrap=pthread_create, which extracts libgcc.a(generic-morestack-thread.o).

This fixes the regression caused by 09602d3b47ec83abb2c26efa5a199c13b72c7abf by
making the invariant satisfied: no more non-compileBitcodeFiles object file is
produced at postParseObjectFile.

Added: 
    lld/test/ELF/wrap-extract.s

Modified: 
    lld/ELF/Driver.cpp

Removed: 
    


################################################################################
diff  --git a/lld/ELF/Driver.cpp b/lld/ELF/Driver.cpp
index f9ae35f87c211..3c68686e50d09 100644
--- a/lld/ELF/Driver.cpp
+++ b/lld/ELF/Driver.cpp
@@ -2452,6 +2452,9 @@ void LinkerDriver::link(opt::InputArgList &args) {
     for (auto *s : lto::LTO::getRuntimeLibcallSymbols())
       handleLibcall(s);
 
+  // Archive members defining __wrap symbols may be extracted.
+  std::vector<WrappedSymbol> wrapped = addWrappedSymbols(args);
+
   // No more lazy bitcode can be extracted at this point. Do post parse work
   // like checking duplicate symbols.
   parallelForEach(objectFiles, postParseObjectFile);
@@ -2478,8 +2481,6 @@ void LinkerDriver::link(opt::InputArgList &args) {
   // addReservedSymbols to mark the created symbols as not absolute.
   Out::elfHeader = make<OutputSection>("", 0, SHF_ALLOC);
 
-  std::vector<WrappedSymbol> wrapped = addWrappedSymbols(args);
-
   // We need to create some reserved symbols such as _end. Create them.
   if (!config->relocatable)
     addReservedSymbols();

diff  --git a/lld/test/ELF/wrap-extract.s b/lld/test/ELF/wrap-extract.s
new file mode 100644
index 0000000000000..708b9c8c2f011
--- /dev/null
+++ b/lld/test/ELF/wrap-extract.s
@@ -0,0 +1,21 @@
+# REQUIRES: x86
+## --wrap may trigger archive extraction. Test that local symbols are initialized.
+
+# RUN: rm -rf %t && split-file %s %t
+# RUN: llvm-mc -filetype=obj -triple=x86_64 %t/a.s -o %t/a.o
+# RUN: llvm-mc -filetype=obj -triple=x86_64 %t/b.s -o %t/b.o
+# RUN: ld.lld %t/a.o --start-lib %t/b.o --end-lib -o %t/a --wrap pthread_create -o /dev/null
+
+#--- a.s
+.globl _start
+_start:
+.cfi_startproc
+  call pthread_create
+.cfi_endproc
+
+#--- b.s
+.global __wrap_pthread_create
+__wrap_pthread_create:
+.cfi_startproc
+  ret
+.cfi_endproc


        


More information about the llvm-commits mailing list