[lld] 2997441 - [ELF] Support discarding .got.plt
Fangrui Song via llvm-commits
llvm-commits at lists.llvm.org
Fri Nov 19 10:50:59 PST 2021
Author: Fangrui Song
Date: 2021-11-19T10:50:53-08:00
New Revision: 2997441b85c0ec94425e83316d7e63c32d8c5770
URL: https://github.com/llvm/llvm-project/commit/2997441b85c0ec94425e83316d7e63c32d8c5770
DIFF: https://github.com/llvm/llvm-project/commit/2997441b85c0ec94425e83316d7e63c32d8c5770.diff
LOG: [ELF] Support discarding .got.plt
Fix a null pointer dereference when .got.plt is discarded.
This also adds a test for discarding `.plt`.
Reviewed By: ikudrin
Differential Revision: https://reviews.llvm.org/D114180
Added:
lld/test/ELF/linkerscript/discard-plt.s
Modified:
lld/ELF/SyntheticSections.cpp
Removed:
################################################################################
diff --git a/lld/ELF/SyntheticSections.cpp b/lld/ELF/SyntheticSections.cpp
index 1c1720dcbd2a6..f1594eb8df863 100644
--- a/lld/ELF/SyntheticSections.cpp
+++ b/lld/ELF/SyntheticSections.cpp
@@ -1668,11 +1668,11 @@ void RelocationBaseSection::finalizeContents() {
else
getParent()->link = 0;
- if (in.relaPlt == this) {
+ if (in.relaPlt == this && in.gotPlt->getParent()) {
getParent()->flags |= ELF::SHF_INFO_LINK;
getParent()->info = in.gotPlt->getParent()->sectionIndex;
}
- if (in.relaIplt == this) {
+ if (in.relaIplt == this && in.igotPlt->getParent()) {
getParent()->flags |= ELF::SHF_INFO_LINK;
getParent()->info = in.igotPlt->getParent()->sectionIndex;
}
diff --git a/lld/test/ELF/linkerscript/discard-plt.s b/lld/test/ELF/linkerscript/discard-plt.s
new file mode 100644
index 0000000000000..eef04eadd8171
--- /dev/null
+++ b/lld/test/ELF/linkerscript/discard-plt.s
@@ -0,0 +1,37 @@
+# REQUIRES: x86
+# RUN: split-file %s %t
+# RUN: llvm-mc -filetype=obj -triple=x86_64 %t/a.s -o %t/a.o
+
+## Discard .plt, .iplt, and .got.plt
+# RUN: ld.lld -shared -T %t/t %t/a.o -o %t/a
+# RUN: llvm-readelf -S -d %t/a > %t/readelf.txt
+# RUN: FileCheck %s --input-file %t/readelf.txt
+# RUN: FileCheck %s --input-file %t/readelf.txt --check-prefix=NEG
+
+# CHECK: [Nr] Name Type Address Off Size ES Flg Lk Inf Al
+# CHECK: ] .rela.plt RELA [[#%x,]] [[#%x,]] 000018 18 A 1 0 8
+
+# CHECK: (PLTGOT) 0x0
+# CHECK: (PLTREL) RELA
+
+# NEG-NOT: ] .plt
+# NEG-NOT: ] .iplt
+# NEG-NOT: ] .got.plt
+
+#--- a.s
+ call foo
+ call ifunc
+
+.type ifunc, @gnu_indirect_function
+.hidden ifunc
+ifunc:
+ ret
+
+.data
+.quad ifunc
+
+#--- t
+SECTIONS {
+ .text : { *(.text) }
+ /DISCARD/ : { *(.plt .iplt .got.plt) }
+}
More information about the llvm-commits
mailing list