[lld] e281376 - [ELF] --wrap: set isUsedInRegularObj of __wrap_ only if it is defined

Fangrui Song via llvm-commits llvm-commits at lists.llvm.org
Sat Aug 1 18:20:48 PDT 2020


Author: Fangrui Song
Date: 2020-08-01T18:19:14-07:00
New Revision: e281376e996e37fb6411363510e917b5b2c53c89

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

LOG: [ELF] --wrap: set isUsedInRegularObj of __wrap_ only if it is defined

Fixes PR46169

Added: 
    

Modified: 
    lld/ELF/Driver.cpp
    lld/test/ELF/wrap-dynamic-undef.s
    lld/test/ELF/wrap-shlib-undefined.s

Removed: 
    


################################################################################
diff  --git a/lld/ELF/Driver.cpp b/lld/ELF/Driver.cpp
index cdb735596837..3e60ffdb1dc1 100644
--- a/lld/ELF/Driver.cpp
+++ b/lld/ELF/Driver.cpp
@@ -1782,7 +1782,7 @@ static std::vector<WrappedSymbol> addWrappedSymbols(opt::InputArgList &args) {
       continue;
 
     Symbol *real = addUndefined(saver.save("__real_" + name));
-    Symbol *wrap = addUndefined(saver.save("__wrap_" + name));
+    Symbol *wrap = addUnusedUndefined(saver.save("__wrap_" + name));
     v.push_back({sym, real, wrap});
 
     // We want to tell LTO not to inline symbols to be overwritten
@@ -1792,7 +1792,8 @@ static std::vector<WrappedSymbol> addWrappedSymbols(opt::InputArgList &args) {
 
     // Tell LTO not to eliminate these symbols.
     sym->isUsedInRegularObj = true;
-    wrap->isUsedInRegularObj = true;
+    if (wrap->isDefined())
+      wrap->isUsedInRegularObj = true;
   }
   return v;
 }

diff  --git a/lld/test/ELF/wrap-dynamic-undef.s b/lld/test/ELF/wrap-dynamic-undef.s
index 2abb826411b3..af2871cfe6ea 100644
--- a/lld/test/ELF/wrap-dynamic-undef.s
+++ b/lld/test/ELF/wrap-dynamic-undef.s
@@ -8,10 +8,9 @@
 # Test that the dynamic relocation uses foo. We used to produce a
 # relocation with __real_foo.
 
-# CHECK:      Symbol table '.dynsym' contains 3 entries:
+# CHECK:      Symbol table '.dynsym' contains 2 entries:
 # CHECK:      NOTYPE  LOCAL  DEFAULT  UND
 # CHECK-NEXT: NOTYPE  GLOBAL DEFAULT  UND foo
-# CHECK-NEXT: NOTYPE  GLOBAL DEFAULT  UND __wrap_foo
 
 .global _start
 _start:

diff  --git a/lld/test/ELF/wrap-shlib-undefined.s b/lld/test/ELF/wrap-shlib-undefined.s
index 8bbda963f070..b0451b2865ab 100644
--- a/lld/test/ELF/wrap-shlib-undefined.s
+++ b/lld/test/ELF/wrap-shlib-undefined.s
@@ -12,12 +12,11 @@
 # RUN: ld.lld %t.o %t.so --wrap=foo -o %t
 # RUN: llvm-readelf --dyn-syms %t | FileCheck %s
 
-## FIXME GNU ld does not export __wrap_foo
 ## The reference __real_foo from %t.so causes foo to be exported.
-# CHECK:      Symbol table '.dynsym' contains 4 entries:
+## __wrap_foo is not used, thus not exported.
+# CHECK:      Symbol table '.dynsym' contains 3 entries:
 # CHECK:      NOTYPE  LOCAL  DEFAULT  UND
 # CHECK-NEXT: NOTYPE  GLOBAL DEFAULT  UND bar
-# CHECK-NEXT: NOTYPE  GLOBAL DEFAULT  UND __wrap_foo
 # CHECK-NEXT: NOTYPE  GLOBAL DEFAULT    6 foo
 
 .globl _start, foo


        


More information about the llvm-commits mailing list