[PATCH] D41592: [ELF] - Add missing dynamic tags when producing output with IRelative relocations only.

George Rimar via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Thu Dec 28 02:49:32 PST 2017


grimar updated this revision to Diff 128278.
grimar added a comment.

- Reimplemented in according to review suggestions.


https://reviews.llvm.org/D41592

Files:
  ELF/SyntheticSections.cpp
  test/ELF/gnu-ifunc-dyntags.s


Index: test/ELF/gnu-ifunc-dyntags.s
===================================================================
--- test/ELF/gnu-ifunc-dyntags.s
+++ test/ELF/gnu-ifunc-dyntags.s
@@ -0,0 +1,41 @@
+# REQUIRES: x86
+# RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t.o
+# RUN: ld.lld -pie %t.o -o %tout
+# RUN: llvm-objdump -section-headers %tout | FileCheck %s
+# RUN: llvm-readobj -dynamic-table -r %tout | FileCheck %s --check-prefix=TAGS
+
+## Check we produce DT_PLTREL/DT_JMPREL/DT_PLTGOT and DT_PLTRELSZ tags
+## when there are no other relocations except R_*_IRELATIVE.
+
+# CHECK:  Name          Size      Address
+# CHECK:  .rela.plt   00000030 0000000000000210
+# CHECK:  .got.plt    00000010 0000000000002000
+
+# TAGS:      Relocations [
+# TAGS-NEXT:   Section {{.*}} .rela.plt {
+# TAGS-NEXT:     R_X86_64_IRELATIVE
+# TAGS-NEXT:     R_X86_64_IRELATIVE
+# TAGS-NEXT:   }
+# TAGS-NEXT: ]
+
+# TAGS:   Tag                Type                 Name/Value
+# TAGS:   0x0000000000000017 JMPREL               0x210
+# TAGS:   0x0000000000000002 PLTRELSZ             48
+# TAGS:   0x0000000000000003 PLTGOT               0x2000
+# TAGS:   0x0000000000000014 PLTREL               RELA
+
+.text
+.type foo STT_GNU_IFUNC
+.globl foo
+foo:
+ ret
+
+.type bar STT_GNU_IFUNC
+.globl bar
+bar:
+ ret
+
+.globl _start
+_start:
+ call foo
+ call bar
Index: ELF/SyntheticSections.cpp
===================================================================
--- ELF/SyntheticSections.cpp
+++ ELF/SyntheticSections.cpp
@@ -1081,7 +1081,13 @@
         addInt(IsRela ? DT_RELACOUNT : DT_RELCOUNT, NumRelativeRels);
     }
   }
-  if (InX::RelaPlt->getParent() && !InX::RelaPlt->empty()) {
+  // .rel[a].plt section usually consists of two parts, containing plt and
+  // iplt relocations. It is possible to have only iplt relocations in the
+  // output. In that case RelaPlt is empty and have zero offset, the same offset
+  // 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 (InX::RelaPlt->getParent()->Live) {
     addInSec(DT_JMPREL, InX::RelaPlt);
     addSize(DT_PLTRELSZ, InX::RelaPlt->getParent());
     switch (Config->EMachine) {


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D41592.128278.patch
Type: text/x-patch
Size: 2258 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20171228/c6c41c38/attachment.bin>


More information about the llvm-commits mailing list