[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
Fri Jun 28 03:16:48 PDT 2019


This revision was automatically updated to reflect the committed changes.
Closed by commit rL364639: [ELF] Do not produce DT_JMPREL and DT_PLTGOT if .rela.plt is empty. (authored by ikudrin, committed by ).

Changed prior to commit:
  https://reviews.llvm.org/D63869?vs=207007&id=207022#toc

Repository:
  rL LLVM

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

https://reviews.llvm.org/D63869

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


Index: lld/trunk/test/ELF/linkerscript/empty-relaplt-dyntags.test
===================================================================
--- lld/trunk/test/ELF/linkerscript/empty-relaplt-dyntags.test
+++ lld/trunk/test/ELF/linkerscript/empty-relaplt-dyntags.test
@@ -0,0 +1,44 @@
+# 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 --sections %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 slots in .got.plt it considers reserved to support lazy symbol
+## resolution. In fact, as .got.plt is also empty, that memory might be
+## allocated for something else.
+
+# CHECK: Sections [
+# CHECK:      Name: .rela.plt
+# CHECK-NEXT: Type: SHT_RELA
+# CHECK-NEXT: Flags [
+# CHECK-NEXT:   SHF_ALLOC
+# CHECK-NEXT: ]
+# CHECK-NEXT: Address:
+# CHECK-NEXT: Offset:
+# CHECK-NEXT: Size: 0
+# CHECK:      Name: .got.plt
+# CHECK-NEXT: Type: SHT_PROGBITS
+# CHECK-NEXT: Flags [
+# CHECK-NEXT:   SHF_ALLOC
+# CHECK-NEXT:   SHF_WRITE
+# CHECK-NEXT: ]
+# CHECK-NEXT: Address:
+# CHECK-NEXT: Offset:
+# CHECK-NEXT: Size: 0
+
+# 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
+  .got.plt : {*(.got.plt)}: all
+}
Index: lld/trunk/ELF/SyntheticSections.cpp
===================================================================
--- lld/trunk/ELF/SyntheticSections.cpp
+++ lld/trunk/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.207022.patch
Type: text/x-patch
Size: 2235 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20190628/40d2308f/attachment.bin>


More information about the llvm-commits mailing list