[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
Wed Dec 27 16:57:12 PST 2017


George Rimar via Phabricator <reviews at reviews.llvm.org> writes:

> grimar created this revision.
> grimar added reviewers: ruiu, rafael.
> Herald added a subscriber: fedor.sergeev.
>
> This is "Bug 35751 - .dynamic relocation entries omitted if output
> contains only IFUNC relocations"
>
> We have `InX::RelaPlt` and `InX::RelaIPlt` synthetic sections for PLT relocations.
> They are usually live in `rela.plt` section. Problem appears when `InX::RelaPlt`
> section is empty. In that case we did not produce normal set of dynamic tags
> required, because logic was written in the way assuming we always have
> non-IRelative relocations in `rela.plt`.
>
> Patch fixes the issue.
>
>
> 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
> @@ -1024,6 +1024,20 @@
>    Entries.push_back({Tag, [=] { return Sym->getVA(); }});
>  }
>  
> +// RelaIplt section is used to store IRelative relocations and usually
> +// immediately follows RelaPlt section in the same output section .rel[a].plt.
> +// At the same time any of these sections can be empty in case there is no
> +// corresponding relocations in output. Function is used to find the first
> +// non-empty input section with relocations in .rel[a].plt if any exist.
> +static RelocationBaseSection *findFirstRelPltSection() {
> +  if (InX::RelaPlt->getParent() && !InX::RelaPlt->empty())
> +    return InX::RelaPlt;
> +  if (InX::RelaIplt->Name == InX::RelaPlt->Name && InX::RelaIplt->getParent() &&
> +      !InX::RelaIplt->empty())
> +    return InX::RelaIplt;
> +  return nullptr;
> +}
> +
>  // Add remaining entries to complete .dynamic contents.
>  template <class ELFT> void DynamicSection<ELFT>::finalizeContents() {
>    if (this->Size)
> @@ -1081,20 +1095,27 @@
>          addInt(IsRela ? DT_RELACOUNT : DT_RELCOUNT, NumRelativeRels);
>      }
>    }
> -  if (InX::RelaPlt->getParent() && !InX::RelaPlt->empty()) {

This runs after  removeUnusedSyntheticSections, right? If so I think we
can just drop InX::RelaPlt->empty() and use addOutSec instead of
addInSec, no?

Cheers,
Rafael


More information about the llvm-commits mailing list