Copy relocation on a non-default version symbol is unsupported and can crash at runtime. Fortunately there is a one-line fix which works for most cases: ensure `getSymbolsAt` unconditionally returns `ss`. If two non-default version symbols are defined at the same place and both are copy relocated, our implementation will copy relocated them into different addresses. The pointer inequality is very unlikely an issue. In GNU ld, copy relocating version aliases seems to create more pointer inequality problems than us. ( In glibc, sys_errlist@GLIBC_2.2.5 sys_errlist@GLIBC_2.3 sys_errlist@GLIBC_2.4 are defined at the same place, but it is unlikely they are all copy relocated in one executable. Even if so, the variables are read-only and pointer inequality should not be a problem. ) Reviewed By: peter.smith Differential Revision: https://reviews.llvm.org/D107535
28 lines
1003 B
ArmAsm
28 lines
1003 B
ArmAsm
# REQUIRES: x86
|
|
## Copy relocate a versioned symbol which has a versioned alias.
|
|
|
|
# RUN: llvm-mc -filetype=obj -triple=x86_64 %s -o %t1.o
|
|
# RUN: llvm-mc -filetype=obj -triple=x86_64 %p/Inputs/copy-rel-version.s -o %t.o
|
|
# RUN: echo 'v1 {}; v2 {}; v3 {};' > %t.ver
|
|
# RUN: ld.lld %t.o -shared -soname t.so --version-script=%t.ver -o %t.so
|
|
|
|
## Copy relocate the default version symbol.
|
|
# RUN: ld.lld %t1.o %t.so -o %t1
|
|
# RUN: llvm-readelf --dyn-syms %t1 | FileCheck %s --check-prefix=CHECK1
|
|
|
|
# CHECK1: 1: {{.+}} 12 OBJECT GLOBAL DEFAULT [[#]] foo@v3
|
|
# CHECK1-EMPTY:
|
|
|
|
## Copy relocate the non-default version symbol.
|
|
# RUN: llvm-objcopy --redefine-sym foo=foo@v1 %t1.o %t2.o
|
|
# RUN: ld.lld %t2.o %t.so -o %t2
|
|
# RUN: llvm-readelf --dyn-syms %t2 | FileCheck %s --check-prefix=CHECK2
|
|
|
|
# CHECK2: 1: [[ADDR:[0-9a-f]+]] 4 OBJECT GLOBAL DEFAULT [[#]] foo@v1
|
|
# CHECK2-NEXT: 2: [[ADDR]] 12 OBJECT GLOBAL DEFAULT [[#]] foo@v3
|
|
# CHECK2-EMPTY:
|
|
|
|
.global _start
|
|
_start:
|
|
leaq foo, %rax
|