[PATCH] D107535: [ELF] Support copy relocation on non-default version symbols
Fangrui Song via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Thu Aug 5 10:30:05 PDT 2021
MaskRay updated this revision to Diff 364539.
MaskRay edited the summary of this revision.
MaskRay added a comment.
update comments
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D107535/new/
https://reviews.llvm.org/D107535
Files:
lld/ELF/Relocations.cpp
lld/test/ELF/Inputs/copy-rel-version.s
lld/test/ELF/copy-rel-version.s
Index: lld/test/ELF/copy-rel-version.s
===================================================================
--- lld/test/ELF/copy-rel-version.s
+++ lld/test/ELF/copy-rel-version.s
@@ -1,15 +1,27 @@
-// REQUIRES: x86
-// RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t.o
-// RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %p/Inputs/copy-rel-version.s -o %t1.o
-// RUN: echo "v1 {}; v2 {};" > %t.ver
-// RUN: ld.lld %t1.o -shared -soname t1.so --version-script=%t.ver -o %t1.so
-// RUN: ld.lld %t.o %t1.so -o %t
-// RUN: llvm-readobj --symbols %t | FileCheck %s
+# 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 at v3
+# CHECK1-EMPTY:
+
+## Copy relocate the non-default version symbol.
+# RUN: llvm-objcopy --redefine-sym foo=foo at 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 at v1
+# CHECK2-NEXT: 2: [[ADDR]] 12 OBJECT GLOBAL DEFAULT [[#]] foo at v3
+# CHECK2-EMPTY:
.global _start
_start:
leaq foo, %rax
-
-// CHECK: Name: foo (
-// CHECK-NEXT: Value:
-// CHECK-NEXT: Size: 8
Index: lld/test/ELF/Inputs/copy-rel-version.s
===================================================================
--- lld/test/ELF/Inputs/copy-rel-version.s
+++ lld/test/ELF/Inputs/copy-rel-version.s
@@ -1,11 +1,22 @@
.data
-.global foo at v1
-.type foo at v1, @object
-.size foo at v1, 4
-.global foo@@v2
-.type foo@@v2, @object
-.size foo@@v2, 8
-foo at v1:
-foo@@v2:
+.global foo_v1
+.symver foo_v1, foo at v1, remove
+.type foo_v1, @object
+.size foo_v1, 4
+
+.global foo_v2
+.symver foo_v2, foo at v2, remove
+.type foo_v2, @object
+.size foo_v2, 8
+
+.global foo
+.symver foo, foo@@@v3
+.type foo, @object
+.size foo, 12
+
+foo_v1:
+foo_v2:
+foo:
+.int 0
.int 0
.int 0
Index: lld/ELF/Relocations.cpp
===================================================================
--- lld/ELF/Relocations.cpp
+++ lld/ELF/Relocations.cpp
@@ -527,6 +527,13 @@
if (auto *alias = dyn_cast_or_null<SharedSymbol>(sym))
ret.insert(alias);
}
+
+ // The loop does not check SHT_GNU_verneed, so ret does not contain
+ // non-default version symbols. If ss has a non-default version, ret won't
+ // contain ss. Just add ss unconditionally. If a non-default version alias is
+ // separately copy relocated, it and ss will have different addresses.
+ // Fortunately this case is impractical and fails with GNU ld as well.
+ ret.insert(&ss);
return ret;
}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D107535.364539.patch
Type: text/x-patch
Size: 3029 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20210805/88deb1f1/attachment.bin>
More information about the llvm-commits
mailing list