[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