[PATCH] D63869: [ELF] Do not produce DT_JMPREL and DT_PLTGOT if .rela.plt is empty.

Igor Kudrin via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Thu Jun 27 04:50:08 PDT 2019


ikudrin updated this revision to Diff 206829.
ikudrin added a comment.

- Reworked the test.

I am not sure about moving it into `linkerscript`, though, because it does not test the support for linker scripts per se. Moreover, there are lots of tests in the main test folder which also use linker scripts.


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D63869/new/

https://reviews.llvm.org/D63869

Files:
  ELF/SyntheticSections.cpp
  test/ELF/empty-relaplt-dyntags.test


Index: test/ELF/empty-relaplt-dyntags.test
===================================================================
--- /dev/null
+++ test/ELF/empty-relaplt-dyntags.test
@@ -0,0 +1,24 @@
+# REQUIRES: x86
+# RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux /dev/null -o %t.o
+
+# RUN: ld.lld -shared %t.o -T %s -o %t
+# RUN: llvm-readobj --dynamic-table %t | FileCheck %s
+
+## In spite of .rela.plt is empty, it might have been preserved because it is
+## mentioned in the linker script. However, even in that case we should not
+## produce DT_JMPREL and DT_PLTGOT tags because this can cause a dynamic loader
+## to write into memory it considers reserved. In fact, as .got.plt is also
+## empty, that memory might be allocated for something else.
+
+# CHECK: DynamicSection [
+# CHECK-NOT: JMPREL
+# CHECK-NOT: PLTGOT
+
+PHDRS {
+  all PT_LOAD;
+  dyn PT_DYNAMIC;
+}
+SECTIONS {
+  .rela.plt : { *(.rela.plt) }: all
+  .dynamic : { *(.dynamic) }: all : dyn
+}
Index: ELF/SyntheticSections.cpp
===================================================================
--- ELF/SyntheticSections.cpp
+++ ELF/SyntheticSections.cpp
@@ -1339,7 +1339,7 @@
   // as RelaIplt have. And we still want to emit proper dynamic tags for that
   // case, so here we always use RelaPlt as marker for the begining of
   // .rel[a].plt section.
-  if (IsMain && In.RelaPlt->getParent()->isLive()) {
+  if (IsMain && (In.RelaPlt->isNeeded() || In.RelaIplt->isNeeded())) {
     addInSec(DT_JMPREL, In.RelaPlt);
     Entries.push_back({DT_PLTRELSZ, addPltRelSz});
     switch (Config->EMachine) {


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D63869.206829.patch
Type: text/x-patch
Size: 1569 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20190627/4d69f151/attachment.bin>


More information about the llvm-commits mailing list