[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