mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2024-12-11 17:08:42 +00:00
[ELF] Allow R_PLT_PC (R_PC) to a hidden undefined weak symbol
This essentially reverts b841e119d7
.
Such code construct can be used in the following way:
// glibc/stdlib/exit.c
// clang -fuse-ld=lld => succeeded
// clang -fuse-ld=lld -fpie -pie => relocation R_PLT_PC cannot refer to absolute symbol
__attribute__((weak, visibility("hidden"))) extern void __call_tls_dtors();
void __run_exit_handlers() {
if (__call_tls_dtors)
__call_tls_dtors();
}
Since we allow R_PLT_PC in -no-pie mode, it makes sense to allow it in
-pie mode as well.
Reviewed By: pcc
Differential Revision: https://reviews.llvm.org/D72943
This commit is contained in:
parent
7b30370e5b
commit
6ab89c3c5d
@ -408,6 +408,14 @@ static bool isStaticLinkTimeConstant(RelExpr e, RelType type, const Symbol &sym,
|
||||
|
||||
assert(absVal && relE);
|
||||
|
||||
// Allow R_PLT_PC (optimized to R_PC here) to a hidden undefined weak symbol
|
||||
// in PIC mode. This is a little strange, but it allows us to link function
|
||||
// calls to such symbols (e.g. glibc/stdlib/exit.c:__run_exit_handlers).
|
||||
// Normally such a call will be guarded with a comparison, which will load a
|
||||
// zero from the GOT.
|
||||
if (sym.isUndefWeak())
|
||||
return true;
|
||||
|
||||
// We set the final symbols values for linker script defined symbols later.
|
||||
// They always can be computed as a link time constant.
|
||||
if (sym.scriptDefined)
|
||||
|
@ -2,6 +2,11 @@
|
||||
// RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t.o
|
||||
// RUN: ld.lld %t.o -o %t.so -shared
|
||||
// RUN: llvm-readobj -r -S --section-data %t.so | FileCheck %s
|
||||
// RUN: ld.lld %t.o -o %t -pie
|
||||
// RUN: llvm-readobj -r -S --section-data %t | FileCheck %s
|
||||
|
||||
/// This is usually guarded with a comparison. Don't report an error.
|
||||
call g
|
||||
|
||||
.data
|
||||
.weak g
|
||||
|
Loading…
Reference in New Issue
Block a user