[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