[PATCH] D41592: [ELF] - Add missing dynamic tags when producing output with IRelative relocations only.
Rafael Avila de Espindola via llvm-commits
llvm-commits at lists.llvm.org
Thu Dec 28 08:43:12 PST 2017
LGTM.
Thanks,
Rafael
George Rimar via Phabricator <reviews at reviews.llvm.org> writes:
> 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) {
>
>
> 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) {
More information about the llvm-commits
mailing list