Fix linker-defined symbols possibly not being defined when -wrap is used
authorThomas Anderson <thomasanderson@google.com>
Wed, 2 Jan 2019 19:28:00 +0000 (19:28 +0000)
committerThomas Anderson <thomasanderson@google.com>
Wed, 2 Jan 2019 19:28:00 +0000 (19:28 +0000)
Fixes https://bugs.llvm.org/show_bug.cgi?id=40134

addWrappedSymbols() must be called before addReservedSymbols() because the
latter only defines reserved symbols when they are undefined in the symbol
table. If addWrappedSymbols() is called after, then addUndefined() is called
which may lazily pull in more object files that could reference reserved
symbols.

Differential Revision: https://reviews.llvm.org/D56110

llvm-svn: 350251

lld/ELF/Driver.cpp
lld/test/ELF/Inputs/wrap-with-archive.s [new file with mode: 0644]
lld/test/ELF/wrap-with-archive.s [new file with mode: 0644]

index 51daa81..13b6119 100644 (file)
@@ -1550,6 +1550,9 @@ template <class ELFT> void LinkerDriver::link(opt::InputArgList &Args) {
   Out::ElfHeader = make<OutputSection>("", 0, SHF_ALLOC);
   Out::ElfHeader->Size = sizeof(typename ELFT::Ehdr);
 
+  // Create wrapped symbols for -wrap option.
+  std::vector<WrappedSymbol> Wrapped = addWrappedSymbols<ELFT>(Args);
+
   // We need to create some reserved symbols such as _end. Create them.
   if (!Config->Relocatable)
     addReservedSymbols();
@@ -1562,9 +1565,6 @@ template <class ELFT> void LinkerDriver::link(opt::InputArgList &Args) {
   if (!Config->Relocatable)
     Symtab->scanVersionScript();
 
-  // Create wrapped symbols for -wrap option.
-  std::vector<WrappedSymbol> Wrapped = addWrappedSymbols<ELFT>(Args);
-
   // Do link-time optimization if given files are LLVM bitcode files.
   // This compiles bitcode files into real object files.
   //
diff --git a/lld/test/ELF/Inputs/wrap-with-archive.s b/lld/test/ELF/Inputs/wrap-with-archive.s
new file mode 100644 (file)
index 0000000..93aaddc
--- /dev/null
@@ -0,0 +1,5 @@
+.global __executable_start
+.global __wrap_get_executable_start
+
+__wrap_get_executable_start:   
+       movabs $__executable_start,%rdx
diff --git a/lld/test/ELF/wrap-with-archive.s b/lld/test/ELF/wrap-with-archive.s
new file mode 100644 (file)
index 0000000..1bfbdce
--- /dev/null
@@ -0,0 +1,13 @@
+// REQUIRES: x86
+// RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t
+// RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %p/Inputs/wrap-with-archive.s -o %t2
+// RUN: llvm-ar rcs %t3 %t2
+// RUN: ld.lld -o %t4 %t %t3 -wrap get_executable_start
+
+// Regression test for https://bugs.llvm.org/show_bug.cgi?id=40134
+       
+.global get_executable_start
+.global _start
+
+_start:
+       jmp get_executable_start