[PATCH] D114180: [ELF] Support discarding .got.plt

Fangrui Song via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Thu Nov 18 11:11:06 PST 2021


MaskRay created this revision.
MaskRay added reviewers: andrewrk, ikudrin.
Herald added subscribers: arichardson, emaste.
MaskRay requested review of this revision.
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.

Fix a null pointer dereference when .got.plt is discarded.

This also adds a test for discarding `.plt`.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D114180

Files:
  lld/ELF/SyntheticSections.cpp
  lld/test/ELF/linkerscript/discard-plt.s


Index: lld/test/ELF/linkerscript/discard-plt.s
===================================================================
--- /dev/null
+++ 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) }
+}
Index: lld/ELF/SyntheticSections.cpp
===================================================================
--- lld/ELF/SyntheticSections.cpp
+++ lld/ELF/SyntheticSections.cpp
@@ -1668,11 +1668,11 @@
   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;
   }


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D114180.388272.patch
Type: text/x-patch
Size: 1689 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20211118/29eeb4e1/attachment.bin>


More information about the llvm-commits mailing list