[PATCH] D71819: [ELF] Support input section description .gnu.version* in /DISCARD/
Fangrui Song via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Wed Dec 25 14:55:35 PST 2019
MaskRay updated this revision to Diff 235297.
MaskRay edited the summary of this revision.
MaskRay added a comment.
Suppress DT_VER* if the relevant section is discarded.
Coincidentally, someone asked https://sourceware.org/ml/binutils/2019-12/msg00329.html
With this patch, that use case can be satisified with:
/DISCARD/ : { *(.gnu.version*) }
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D71819/new/
https://reviews.llvm.org/D71819
Files:
lld/ELF/SyntheticSections.cpp
lld/test/ELF/linkerscript/discard-gnu-version.s
Index: lld/test/ELF/linkerscript/discard-gnu-version.s
===================================================================
--- /dev/null
+++ lld/test/ELF/linkerscript/discard-gnu-version.s
@@ -0,0 +1,57 @@
+# REQUIRES: x86
+# RUN: echo '.globl f; f:' | llvm-mc -filetype=obj -triple=x86_64 - -o %t1.o
+# RUN: echo 'v1 { f; };' > %t1.ver
+# RUN: ld.lld -shared --version-script %t1.ver %t1.o -o %t1.so
+
+# RUN: llvm-mc -filetype=obj -triple=x86_64 %s -o %t.o
+# RUN: echo 'v1 { foo; };' > %t.ver
+# RUN: ld.lld -shared --version-script %t.ver %t.o %t1.so -o %t.so
+# RUN: llvm-readelf -S -d %t.so | FileCheck %s
+
+# CHECK: .gnu.version
+# CHECK: .gnu.version_d
+# CHECK: .gnu.version_r
+
+# CHECK: (VERSYM)
+# CHECK-NEXT: (VERDEF)
+# CHECK-NEXT: (VERDEFNUM)
+# CHECK-NEXT: (VERNEED)
+# CHECK-NEXT: (VERNEEDNUM)
+
+## Discard all of .gnu.version*
+# RUN: echo 'SECTIONS { /DISCARD/ : { *(.gnu.version*) } }' > %t.script
+# RUN: ld.lld -shared --version-script %t.ver -T %t.script %t.o %t1.so -o %t.so
+# RUN: llvm-readelf -S %t.so | FileCheck /dev/null --implicit-check-not=.gnu.version --implicit-check-not='(VER'
+
+## Discard .gnu.version
+# RUN: echo 'SECTIONS { /DISCARD/ : { *(.gnu.version) } }' > %t.noversym.script
+# RUN: ld.lld -shared --version-script %t.ver -T %t.noversym.script %t.o %t1.so -o %t.noversym.so
+# RUN: llvm-readelf -S %t.noversym.so | FileCheck --check-prefix=NOVERSYM %s --implicit-check-not=.gnu.version
+
+# NOVERSYM: .gnu.version_d
+# NOVERSYM: .gnu.version_r
+# NOVERSYM-NOT: (VERSYM)
+
+## Discard .gnu.version_d
+# RUN: echo 'SECTIONS { /DISCARD/ : { *(.gnu.version_d) } }' > %t.noverdef.script
+# RUN: ld.lld -shared --version-script %t.ver -T %t.noverdef.script %t.o %t1.so -o %t.noverdef.so
+# RUN: llvm-readelf -S %t.noverdef.so | FileCheck --check-prefix=NOVERDEF %s --implicit-check-not=.gnu.version_d
+
+# NOVERDEF: .gnu.version
+# NOVERDEF: .gnu.version_r
+# NOVERDEF-NOT: (VERDEF)
+# NOVERDEF-NOT: (VERDEFNUM)
+
+## Discard .gnu.version_r
+# RUN: echo 'SECTIONS { /DISCARD/ : { *(.gnu.version_r) } }' > %t.noverneed.script
+# RUN: ld.lld -shared --version-script %t.ver -T %t.noverneed.script %t.o %t1.so -o %t.noverneed.so
+# RUN: llvm-readelf -S %t.noverdef.so | FileCheck --check-prefix=NOVERDEF %s --implicit-check-not=.gnu.version_r
+
+# NOVERNEED: .gnu.version
+# NOVERNEED: .gnu.version_d
+# NOVERNEED-NOT: (VERNEED)
+# NOVERNEED-NOT: (VERNEEDNUM)
+
+.globl foo
+foo:
+ call f at plt
Index: lld/ELF/SyntheticSections.cpp
===================================================================
--- lld/ELF/SyntheticSections.cpp
+++ lld/ELF/SyntheticSections.cpp
@@ -1438,13 +1438,13 @@
}
bool hasVerNeed = SharedFile::vernauxNum != 0;
- if (hasVerNeed || part.verDef)
+ if ((hasVerNeed || part.verDef) && part.verSym->isLive())
addInSec(DT_VERSYM, part.verSym);
if (part.verDef) {
addInSec(DT_VERDEF, part.verDef);
addInt(DT_VERDEFNUM, getVerDefNum());
}
- if (hasVerNeed) {
+ if (hasVerNeed && part.verNeed->isLive()) {
addInSec(DT_VERNEED, part.verNeed);
unsigned needNum = 0;
for (SharedFile *f : sharedFiles)
@@ -2963,7 +2963,8 @@
}
bool VersionTableSection::isNeeded() const {
- return getPartition().verDef || getPartition().verNeed->isNeeded();
+ return isLive() &&
+ (getPartition().verDef || getPartition().verNeed->isNeeded());
}
void addVerneed(Symbol *ss) {
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D71819.235297.patch
Type: text/x-patch
Size: 3385 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20191225/64877fe2/attachment.bin>
More information about the llvm-commits
mailing list