[lld] r367745 - [ELF] Move R_*_IRELATIVE from .rel[a].plt to .rel[a].dyn unless --pack-dyn-relocs=android[+relr]

Fangrui Song via llvm-commits llvm-commits at lists.llvm.org
Fri Aug 2 19:26:53 PDT 2019


Author: maskray
Date: Fri Aug  2 19:26:52 2019
New Revision: 367745

URL: http://llvm.org/viewvc/llvm-project?rev=367745&view=rev
Log:
[ELF] Move R_*_IRELATIVE from .rel[a].plt to .rel[a].dyn unless --pack-dyn-relocs=android[+relr]

An R_*_IRELATIVE represents the address of a STT_GNU_IFUNC symbol
(redirected at runtime) which is non-preemptable and is not associated
with a canonical PLT (associated with a symbol with a section index of
SHN_UNDEF but a non-zero st_value).

.rel[a].plt [DT_JMPREL, DT_JMPREL+DT_JMPRELSZ) contains relocations that
can be lazily resolved. R_*_IRELATIVE are always eagerly resolved, so
conceptually they do not belong to .rela.plt. "iplt" is mostly a misnomer.

glibc powerpc and powerpc64 do not resolve R_*_IRELATIVE if they are in .rela.plt.

    // a.o - synthesized PLT call stub has an R_*_IRELATIVE
    void ifunc(); int main() { ifunc(); }
    // b.o
    static void real() {}
    asm (".type ifunc, %gnu_indirect_function");
    void *ifunc() { return ℜ }

The lld-linked executable crashes. ld.bfd places R_*_IRELATIVE in
.rela.dyn and the executable works.

glibc i386, x86_64, and aarch64 have logic
(glibc/sysdeps/*/dl-machine.h:elf_machine_lazy_rel) to eagerly resolve
R_*_IRELATIVE in .rel[a].plt so the lld-linked executable works.

Move R_*_IRELATIVE from .rel[a].plt to .rel[a].dyn to fix the crashes on
glibc powerpc/powerpc64. This also helps simplifying ifunc
implementation in FreeBSD rtld-elf powerpc64.

If --pack-dyn-relocs=android[+relr] is specified, the Android packed
dynamic relocation format is used for .rela.dyn. We cannot name
in.relaIplt ".rela.dyn" because the output section will have mixed
formats. This can be improved in the future.

Reviewed By: pcc

Differential Revision: https://reviews.llvm.org/D65651

Modified:
    lld/trunk/ELF/SyntheticSections.cpp
    lld/trunk/ELF/Writer.cpp
    lld/trunk/test/ELF/aarch64-gnu-ifunc-nonpreemptable.s
    lld/trunk/test/ELF/aarch64-gnu-ifunc-plt.s
    lld/trunk/test/ELF/aarch64-gnu-ifunc.s
    lld/trunk/test/ELF/aarch64-gnu-ifunc2.s
    lld/trunk/test/ELF/gnu-ifunc-canon.s
    lld/trunk/test/ELF/gnu-ifunc-dyntags.s
    lld/trunk/test/ELF/gnu-ifunc-i386.s
    lld/trunk/test/ELF/gnu-ifunc-plt-i386.s
    lld/trunk/test/ELF/gnu-ifunc-plt.s
    lld/trunk/test/ELF/gnu-ifunc-relative.s
    lld/trunk/test/ELF/gnu-ifunc-shared.s
    lld/trunk/test/ELF/gnu-ifunc.s
    lld/trunk/test/ELF/linkerscript/orphan-report.s
    lld/trunk/test/ELF/ppc32-gnu-ifunc-nonpreemptable.s
    lld/trunk/test/ELF/ppc32-gnu-ifunc.s
    lld/trunk/test/ELF/ppc64-ifunc.s

Modified: lld/trunk/ELF/SyntheticSections.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/SyntheticSections.cpp?rev=367745&r1=367744&r2=367745&view=diff
==============================================================================
--- lld/trunk/ELF/SyntheticSections.cpp (original)
+++ lld/trunk/ELF/SyntheticSections.cpp Fri Aug  2 19:26:52 2019
@@ -1218,6 +1218,25 @@ void DynamicSection<ELFT>::addSym(int32_
   entries.push_back({tag, [=] { return sym->getVA(); }});
 }
 
+// The output section .rela.dyn may include these synthetic sections:
+//
+// - part.relaDyn
+// - in.relaIplt: this is included if in.relaIplt is named .rela.dyn
+// - in.relaPlt: this is included if a linker script places .rela.plt inside
+//   .rela.dyn
+//
+// DT_RELASZ is the total size of the included sections.
+static std::function<uint64_t()> addRelaSz(RelocationBaseSection *relaDyn) {
+  return [=]() {
+    size_t size = relaDyn->getSize();
+    if (in.relaIplt->getParent() == relaDyn->getParent())
+      size += in.relaIplt->getSize();
+    if (in.relaPlt->getParent() == relaDyn->getParent())
+      size += in.relaPlt->getSize();
+    return size;
+  };
+}
+
 // A Linker script may assign the RELA relocation sections to the same
 // output section. When this occurs we cannot just use the OutputSection
 // Size. Moreover the [DT_JMPREL, DT_JMPREL + DT_PLTRELSZ) is permitted to
@@ -1306,9 +1325,11 @@ template <class ELFT> void DynamicSectio
   if (OutputSection *sec = part.dynStrTab->getParent())
     this->link = sec->sectionIndex;
 
-  if (part.relaDyn->isNeeded()) {
+  if (part.relaDyn->isNeeded() ||
+      (in.relaIplt->isNeeded() &&
+       part.relaDyn->getParent() == in.relaIplt->getParent())) {
     addInSec(part.relaDyn->dynamicTag, part.relaDyn);
-    addSize(part.relaDyn->sizeDynamicTag, part.relaDyn->getParent());
+    entries.push_back({part.relaDyn->sizeDynamicTag, addRelaSz(part.relaDyn)});
 
     bool isRela = config->isRela;
     addInt(isRela ? DT_RELAENT : DT_RELENT,

Modified: lld/trunk/ELF/Writer.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Writer.cpp?rev=367745&r1=367744&r2=367745&view=diff
==============================================================================
--- lld/trunk/ELF/Writer.cpp (original)
+++ lld/trunk/ELF/Writer.cpp Fri Aug  2 19:26:52 2019
@@ -355,6 +355,8 @@ template <class ELFT> static void create
       add(sec);
   }
 
+  StringRef relaDynName = config->isRela ? ".rela.dyn" : ".rel.dyn";
+
   for (Partition &part : partitions) {
     auto add = [&](InputSectionBase *sec) {
       sec->partition = part.getNumber();
@@ -378,13 +380,11 @@ template <class ELFT> static void create
     part.dynStrTab = make<StringTableSection>(".dynstr", true);
     part.dynSymTab = make<SymbolTableSection<ELFT>>(*part.dynStrTab);
     part.dynamic = make<DynamicSection<ELFT>>();
-    if (config->androidPackDynRelocs) {
-      part.relaDyn = make<AndroidPackedRelocationSection<ELFT>>(
-          config->isRela ? ".rela.dyn" : ".rel.dyn");
-    } else {
-      part.relaDyn = make<RelocationSection<ELFT>>(
-          config->isRela ? ".rela.dyn" : ".rel.dyn", config->zCombreloc);
-    }
+    if (config->androidPackDynRelocs)
+      part.relaDyn = make<AndroidPackedRelocationSection<ELFT>>(relaDynName);
+    else
+      part.relaDyn =
+          make<RelocationSection<ELFT>>(relaDynName, config->zCombreloc);
 
     if (needsInterpSection())
       add(createInterpSection());
@@ -504,16 +504,14 @@ template <class ELFT> static void create
       config->isRela ? ".rela.plt" : ".rel.plt", /*sort=*/false);
   add(in.relaPlt);
 
-  // The relaIplt immediately follows .rel.plt (.rel.dyn for ARM) to ensure
-  // that the IRelative relocations are processed last by the dynamic loader.
-  // We cannot place the iplt section in .rel.dyn when Android relocation
-  // packing is enabled because that would cause a section type mismatch.
-  // However, because the Android dynamic loader reads .rel.plt after .rel.dyn,
-  // we can get the desired behaviour by placing the iplt section in .rel.plt.
+  // The relaIplt immediately follows .rel[a].dyn to ensure that the IRelative
+  // relocations are processed last by the dynamic loader. We cannot place the
+  // iplt section in .rel.dyn when Android relocation packing is enabled because
+  // that would cause a section type mismatch. However, because the Android
+  // dynamic loader reads .rel.plt after .rel.dyn, we can get the desired
+  // behaviour by placing the iplt section in .rel.plt.
   in.relaIplt = make<RelocationSection<ELFT>>(
-      (config->emachine == EM_ARM && !config->androidPackDynRelocs)
-          ? ".rel.dyn"
-          : in.relaPlt->name,
+      config->androidPackDynRelocs ? in.relaPlt->name : relaDynName,
       /*sort=*/false);
   add(in.relaIplt);
 
@@ -1070,7 +1068,7 @@ template <class ELFT> void Writer<ELFT>:
     ElfSym::globalOffsetTable->section = gotSection;
   }
 
-  // .rela_iplt_{start,end} mark the start and the end of .rela.plt section.
+  // .rela_iplt_{start,end} mark the start and the end of in.relaIplt.
   if (ElfSym::relaIpltStart && in.relaIplt->isNeeded()) {
     ElfSym::relaIpltStart->section = in.relaIplt;
     ElfSym::relaIpltEnd->section = in.relaIplt;

Modified: lld/trunk/test/ELF/aarch64-gnu-ifunc-nonpreemptable.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/aarch64-gnu-ifunc-nonpreemptable.s?rev=367745&r1=367744&r2=367745&view=diff
==============================================================================
--- lld/trunk/test/ELF/aarch64-gnu-ifunc-nonpreemptable.s (original)
+++ lld/trunk/test/ELF/aarch64-gnu-ifunc-nonpreemptable.s Fri Aug  2 19:26:52 2019
@@ -48,7 +48,7 @@ main:
 
 ## The adrp to myfunc should generate a PLT entry and a GOT entry with an
 ## irelative relocation.
-# PDE-RELOC:      .rela.plt {
+# PDE-RELOC:      .rela.dyn {
 # PDE-RELOC-NEXT:   0x220000 R_AARCH64_IRELATIVE - 0x210000
 # PDE-RELOC-NEXT: }
 
@@ -67,6 +67,6 @@ main:
 # PIE-NEXT:    10018: add     x16, x16, #0
 # PIE-NEXT:    1001c: br      x17
 
-# PIE-RELOC:      .rela.plt {
+# PIE-RELOC:      .rela.dyn {
 # PIE-RELOC-NEXT:   0x30000 R_AARCH64_IRELATIVE - 0x10000
 # PIE-RELOC-NEXT: }

Modified: lld/trunk/test/ELF/aarch64-gnu-ifunc-plt.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/aarch64-gnu-ifunc-plt.s?rev=367745&r1=367744&r2=367745&view=diff
==============================================================================
--- lld/trunk/test/ELF/aarch64-gnu-ifunc-plt.s (original)
+++ lld/trunk/test/ELF/aarch64-gnu-ifunc-plt.s Fri Aug  2 19:26:52 2019
@@ -9,12 +9,14 @@
 
 // Check that the IRELATIVE relocations are after the JUMP_SLOT in the plt
 // CHECK: Relocations [
-// CHECK-NEXT:   Section (4) .rela.plt {
-// CHECK:     0x230018 R_AARCH64_JUMP_SLOT bar2 0x0
-// CHECK-NEXT:     0x230020 R_AARCH64_JUMP_SLOT zed2 0x0
+// CHECK-NEXT:   Section (4) .rela.dyn {
 // CHECK-NEXT:     0x230028 R_AARCH64_IRELATIVE - 0x210000
 // CHECK-NEXT:     0x230030 R_AARCH64_IRELATIVE - 0x210004
 // CHECK-NEXT:   }
+// CHECK-NEXT:   Section (5) .rela.plt {
+// CHECK-NEXT:     0x230018 R_AARCH64_JUMP_SLOT bar2 0x0
+// CHECK-NEXT:     0x230020 R_AARCH64_JUMP_SLOT zed2 0x0
+// CHECK-NEXT:   }
 // CHECK-NEXT: ]
 
 // Check that .got.plt entries point back to PLT header
@@ -24,9 +26,10 @@
 // GOTPLT-NEXT:  230020 20002100 00000000 20002100 00000000
 // GOTPLT-NEXT:  230030 20002100 00000000
 
-// Check that the PLTRELSZ tag includes the IRELATIVE relocations
+// Check that the PLTRELSZ tag does not include the IRELATIVE relocations
 // CHECK: DynamicSection [
-// CHECK:   0x0000000000000002 PLTRELSZ             96 (bytes)
+// CHECK:   0x0000000000000008 RELASZ               48 (bytes)
+// CHECK:   0x0000000000000002 PLTRELSZ             48 (bytes)
 
 // Check that a PLT header is written and the ifunc entries appear last
 // DISASM: Disassembly of section .text:

Modified: lld/trunk/test/ELF/aarch64-gnu-ifunc.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/aarch64-gnu-ifunc.s?rev=367745&r1=367744&r2=367745&view=diff
==============================================================================
--- lld/trunk/test/ELF/aarch64-gnu-ifunc.s (original)
+++ lld/trunk/test/ELF/aarch64-gnu-ifunc.s Fri Aug  2 19:26:52 2019
@@ -7,7 +7,7 @@
 // CHECK:      Sections [
 // CHECK:       Section {
 // CHECK:       Index: 1
-// CHECK-NEXT:  Name: .rela.plt
+// CHECK-NEXT:  Name: .rela.dyn
 // CHECK-NEXT:  Type: SHT_RELA
 // CHECK-NEXT:  Flags [
 // CHECK-NEXT:    SHF_ALLOC
@@ -21,7 +21,7 @@
 // CHECK-NEXT:  EntrySize: 24
 // CHECK-NEXT: }
 // CHECK:      Relocations [
-// CHECK-NEXT:   Section ({{.*}}) .rela.plt {
+// CHECK-NEXT:   Section ({{.*}}) .rela.dyn {
 // CHECK-NEXT:     0x220000 R_AARCH64_IRELATIVE
 // CHECK-NEXT:     0x220008 R_AARCH64_IRELATIVE
 // CHECK-NEXT:   }
@@ -54,7 +54,7 @@
 // CHECK-NEXT:    Other [
 // CHECK-NEXT:      STV_HIDDEN
 // CHECK-NEXT:    ]
-// CHECK-NEXT:    Section: .rela.plt
+// CHECK-NEXT:    Section: .rela.dyn
 // CHECK-NEXT:  }
 // CHECK-NEXT:  Symbol {
 // CHECK-NEXT:    Name: __rela_iplt_start
@@ -65,7 +65,7 @@
 // CHECK-NEXT:    Other [
 // CHECK-NEXT:      STV_HIDDEN
 // CHECK-NEXT:    ]
-// CHECK-NEXT:    Section: .rela.plt
+// CHECK-NEXT:    Section: .rela.dyn
 // CHECK-NEXT:  }
 // CHECK-NEXT:  Symbol {
 // CHECK-NEXT:    Name: _start

Modified: lld/trunk/test/ELF/aarch64-gnu-ifunc2.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/aarch64-gnu-ifunc2.s?rev=367745&r1=367744&r2=367745&view=diff
==============================================================================
--- lld/trunk/test/ELF/aarch64-gnu-ifunc2.s (original)
+++ lld/trunk/test/ELF/aarch64-gnu-ifunc2.s Fri Aug  2 19:26:52 2019
@@ -28,7 +28,7 @@
 # SEC: .got.plt PROGBITS 0000000000220000 020000 000008 00 WA 0 0 8
 
 # RELOC:      Relocations [
-# RELOC-NEXT:   Section {{.*}} .rela.plt {
+# RELOC-NEXT:   Section {{.*}} .rela.dyn {
 # RELOC-NEXT:     0x220000 R_AARCH64_IRELATIVE - 0x210000
 # RELOC-NEXT:   }
 # RELOC-NEXT: ]

Modified: lld/trunk/test/ELF/gnu-ifunc-canon.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/gnu-ifunc-canon.s?rev=367745&r1=367744&r2=367745&view=diff
==============================================================================
--- lld/trunk/test/ELF/gnu-ifunc-canon.s (original)
+++ lld/trunk/test/ELF/gnu-ifunc-canon.s Fri Aug  2 19:26:52 2019
@@ -34,14 +34,14 @@
 
 // Two relocs, one for the GOT and the other for .data.
 // IREL2-NOT: R_X86_64_
-// IREL2: .rela.plt
+// IREL2: .rela.dyn
 // IREL2-NEXT: R_X86_64_IRELATIVE
 // IREL2-NEXT: R_X86_64_IRELATIVE
 // IREL2-NOT: R_X86_64_
 
 // One reloc for the canonical PLT.
 // IREL1-NOT: R_X86_64_
-// IREL1: .rela.plt
+// IREL1: .rela.dyn
 // IREL1-NEXT: R_X86_64_IRELATIVE
 // IREL1-NOT: R_X86_64_
 
@@ -51,7 +51,6 @@
 // IREL1-REL2: .rela.dyn
 // IREL1-REL2-NEXT: R_X86_64_RELATIVE
 // IREL1-REL2-NEXT: R_X86_64_RELATIVE
-// IREL1-REL2: .rela.plt
 // IREL1-REL2-NEXT: R_X86_64_IRELATIVE
 // IREL1-REL2-NOT: R_X86_64_
 
@@ -62,7 +61,6 @@
 // IREL1-REL3-NEXT: R_X86_64_RELATIVE
 // IREL1-REL3-NEXT: R_X86_64_RELATIVE
 // IREL1-REL3-NEXT: R_X86_64_RELATIVE
-// IREL1-REL3: .rela.plt
 // IREL1-REL3-NEXT: R_X86_64_IRELATIVE
 // IREL1-REL3-NOT: R_X86_64_
 

Modified: lld/trunk/test/ELF/gnu-ifunc-dyntags.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/gnu-ifunc-dyntags.s?rev=367745&r1=367744&r2=367745&view=diff
==============================================================================
--- lld/trunk/test/ELF/gnu-ifunc-dyntags.s (original)
+++ lld/trunk/test/ELF/gnu-ifunc-dyntags.s Fri Aug  2 19:26:52 2019
@@ -8,19 +8,21 @@
 ## when there are no other relocations except R_*_IRELATIVE.
 
 # CHECK:  Name          Size   VMA
-# CHECK:  .rela.plt   00000030 0000000000000248
+# CHECK:  .rela.dyn   00000030 0000000000000248
 # CHECK:  .got.plt    00000010 0000000000003000
 
 # TAGS:      Relocations [
-# TAGS-NEXT:   Section {{.*}} .rela.plt {
+# TAGS-NEXT:   Section {{.*}} .rela.dyn {
 # TAGS-NEXT:     R_X86_64_IRELATIVE
 # TAGS-NEXT:     R_X86_64_IRELATIVE
 # TAGS-NEXT:   }
 # TAGS-NEXT: ]
 
 # TAGS:   Tag                Type                 Name/Value
-# TAGS:   0x0000000000000017 JMPREL               0x248
-# TAGS:   0x0000000000000002 PLTRELSZ             48
+# TAGS:   0x0000000000000007 RELA                 0x248
+# TAGS:   0x0000000000000008 RELASZ               48 (bytes)
+# TAGS:   0x0000000000000017 JMPREL               0x0
+# TAGS:   0x0000000000000002 PLTRELSZ             0 (bytes)
 # TAGS:   0x0000000000000003 PLTGOT               0x3000
 # TAGS:   0x0000000000000014 PLTREL               RELA
 

Modified: lld/trunk/test/ELF/gnu-ifunc-i386.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/gnu-ifunc-i386.s?rev=367745&r1=367744&r2=367745&view=diff
==============================================================================
--- lld/trunk/test/ELF/gnu-ifunc-i386.s (original)
+++ lld/trunk/test/ELF/gnu-ifunc-i386.s Fri Aug  2 19:26:52 2019
@@ -7,7 +7,7 @@
 // CHECK:      Sections [
 // CHECK:       Section {
 // CHECK:       Index: 1
-// CHECK-NEXT:  Name: .rel.plt
+// CHECK-NEXT:  Name: .rel.dyn
 // CHECK-NEXT:  Type: SHT_REL
 // CHECK-NEXT:  Flags [
 // CHECK-NEXT:    SHF_ALLOC
@@ -21,7 +21,7 @@
 // CHECK-NEXT:  EntrySize: 8
 // CHECK-NEXT: }
 // CHECK:     Relocations [
-// CHECK-NEXT:   Section ({{.*}}) .rel.plt {
+// CHECK-NEXT:   Section ({{.*}}) .rel.dyn {
 // CHECK-NEXT:     0x402000 R_386_IRELATIVE
 // CHECK-NEXT:     0x402004 R_386_IRELATIVE
 // CHECK-NEXT:   }
@@ -46,7 +46,7 @@
 // CHECK-NEXT:   Other [
 // CHECK-NEXT:     STV_HIDDEN
 // CHECK-NEXT:   ]
-// CHECK-NEXT:   Section: .rel.plt
+// CHECK-NEXT:   Section: .rel.dyn
 // CHECK-NEXT: }
 // CHECK-NEXT: Symbol {
 // CHECK-NEXT:   Name: __rel_iplt_start
@@ -57,7 +57,7 @@
 // CHECK-NEXT:   Other [
 // CHECK-NEXT:     STV_HIDDEN
 // CHECK-NEXT:   ]
-// CHECK-NEXT:   Section: .rel.plt
+// CHECK-NEXT:   Section: .rel.dyn
 // CHECK-NEXT: }
 // CHECK-NEXT: Symbol {
 // CHECK-NEXT:   Name: _start

Modified: lld/trunk/test/ELF/gnu-ifunc-plt-i386.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/gnu-ifunc-plt-i386.s?rev=367745&r1=367744&r2=367745&view=diff
==============================================================================
--- lld/trunk/test/ELF/gnu-ifunc-plt-i386.s (original)
+++ lld/trunk/test/ELF/gnu-ifunc-plt-i386.s Fri Aug  2 19:26:52 2019
@@ -9,11 +9,14 @@
 
 // Check that the IRELATIVE relocations are after the JUMP_SLOT in the plt
 // CHECK: Relocations [
-// CHECK-NEXT:   Section (4) .rel.plt {
-// CHECK-NEXT:     0x40300C R_386_JUMP_SLOT bar2
-// CHECK-NEXT:     0x403010 R_386_JUMP_SLOT zed2
+// CHECK-NEXT:   Section (4) .rel.dyn {
 // CHECK-NEXT:     0x403014 R_386_IRELATIVE
 // CHECK-NEXT:     0x403018 R_386_IRELATIVE
+// CHECK-NEXT:   }
+// CHECK-NEXT:   Section (5) .rel.plt {
+// CHECK-NEXT:     0x40300C R_386_JUMP_SLOT bar2
+// CHECK-NEXT:     0x403010 R_386_JUMP_SLOT zed2
+// CHECK-NEXT:   }
 
 // Check that IRELATIVE .got.plt entries point to ifunc resolver and not
 // back to the plt entry + 6.
@@ -21,9 +24,10 @@
 // GOTPLT:       403000 00204000 00000000 00000000 36104000
 // GOTPLT-NEXT:  403010 46104000 00104000 01104000
 
-// Check that the PLTRELSZ tag includes the IRELATIVE relocations
+// Check that the PLTRELSZ tag does not include the IRELATIVE relocations
 // CHECK: DynamicSection [
-// CHECK:  0x00000002 PLTRELSZ             32 (bytes)
+// CHECK:  0x00000012 RELSZ                16 (bytes)
+// CHECK:  0x00000002 PLTRELSZ             16 (bytes)
 
 // Check that a PLT header is written and the ifunc entries appear last
 // DISASM: Disassembly of section .text:

Modified: lld/trunk/test/ELF/gnu-ifunc-plt.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/gnu-ifunc-plt.s?rev=367745&r1=367744&r2=367745&view=diff
==============================================================================
--- lld/trunk/test/ELF/gnu-ifunc-plt.s (original)
+++ lld/trunk/test/ELF/gnu-ifunc-plt.s Fri Aug  2 19:26:52 2019
@@ -9,11 +9,14 @@
 
 // Check that the IRELATIVE relocations are after the JUMP_SLOT in the plt
 // CHECK: Relocations [
-// CHECK-NEXT:   Section (4) .rela.plt {
-// CHECK-NEXT:     0x203018 R_X86_64_JUMP_SLOT bar2 0x0
-// CHECK-NEXT:     0x203020 R_X86_64_JUMP_SLOT zed2 0x0
+// CHECK-NEXT:   Section (4) .rela.dyn {
 // CHECK-NEXT:     0x203028 R_X86_64_IRELATIVE - 0x201000
 // CHECK-NEXT:     0x203030 R_X86_64_IRELATIVE - 0x201001
+// CHECK-NEXT:   }
+// CHECK-NEXT:   Section (5) .rela.plt {
+// CHECK-NEXT:     0x203018 R_X86_64_JUMP_SLOT bar2 0x0
+// CHECK-NEXT:     0x203020 R_X86_64_JUMP_SLOT zed2 0x0
+// CHECK-NEXT:   }
 
 // Check that .got.plt entries point back to PLT header
 // GOTPLT: Contents of section .got.plt:
@@ -22,9 +25,10 @@
 // GOTPLT-NEXT:  203020 46102000 00000000 56102000 00000000
 // GOTPLT-NEXT:  203030 66102000 00000000
 
-// Check that the PLTRELSZ tag includes the IRELATIVE relocations
+// Check that the PLTRELSZ tag does not include the IRELATIVE relocations
 // CHECK: DynamicSection [
-// CHECK:   0x0000000000000002 PLTRELSZ             96 (bytes)
+// CHECK:   0x0000000000000008 RELASZ               48 (bytes)
+// CHECK:   0x0000000000000002 PLTRELSZ             48 (bytes)
 
 // Check that a PLT header is written and the ifunc entries appear last
 // DISASM: Disassembly of section .text:

Modified: lld/trunk/test/ELF/gnu-ifunc-relative.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/gnu-ifunc-relative.s?rev=367745&r1=367744&r2=367745&view=diff
==============================================================================
--- lld/trunk/test/ELF/gnu-ifunc-relative.s (original)
+++ lld/trunk/test/ELF/gnu-ifunc-relative.s Fri Aug  2 19:26:52 2019
@@ -14,7 +14,7 @@ foo:
 _start:
  call foo
 
-// CHECK:      Section ({{.*}}) .rela.plt {
+// CHECK:      Section ({{.*}}) .rela.dyn {
 // CHECK-NEXT:   R_X86_64_IRELATIVE - 0x[[ADDR:.*]]
 // CHECK-NEXT: }
 

Modified: lld/trunk/test/ELF/gnu-ifunc-shared.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/gnu-ifunc-shared.s?rev=367745&r1=367744&r2=367745&view=diff
==============================================================================
--- lld/trunk/test/ELF/gnu-ifunc-shared.s (original)
+++ lld/trunk/test/ELF/gnu-ifunc-shared.s Fri Aug  2 19:26:52 2019
@@ -41,10 +41,13 @@
 // DISASM-NEXT:     105b:       e9 e0 ff ff ff          jmp     -32 <f2 at plt>
 
 // CHECK: Relocations [
-// CHECK-NEXT:   Section (4) .rela.plt {
+// CHECK-NEXT:   Section (4) .rela.dyn {
+// CHECK-NEXT:     0x3028 R_X86_64_IRELATIVE - 0x1000
+// CHECK-NEXT:   }
+// CHECK-NEXT:   Section (5) .rela.plt {
 // CHECK-NEXT:     0x3018 R_X86_64_JUMP_SLOT fct2 0x0
 // CHECK-NEXT:     0x3020 R_X86_64_JUMP_SLOT f2 0x0
-// CHECK-NEXT:     0x3028 R_X86_64_IRELATIVE - 0x1000
+// CHECK-NEXT:   }
 
  // Hidden expect IRELATIVE
  .globl fct

Modified: lld/trunk/test/ELF/gnu-ifunc.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/gnu-ifunc.s?rev=367745&r1=367744&r2=367745&view=diff
==============================================================================
--- lld/trunk/test/ELF/gnu-ifunc.s (original)
+++ lld/trunk/test/ELF/gnu-ifunc.s Fri Aug  2 19:26:52 2019
@@ -7,7 +7,7 @@
 // CHECK:      Sections [
 // CHECK:       Section {
 // CHECK:       Index: 1
-// CHECK-NEXT:  Name: .rela.plt
+// CHECK-NEXT:  Name: .rela.dyn
 // CHECK-NEXT:  Type: SHT_RELA
 // CHECK-NEXT:  Flags [
 // CHECK-NEXT:    SHF_ALLOC
@@ -23,7 +23,7 @@
 // CHECK:      Index: [[GOTPLT]]
 // CHECK-NEXT: Name: .got.plt
 // CHECK:      Relocations [
-// CHECK-NEXT:   Section ({{.*}}) .rela.plt {
+// CHECK-NEXT:   Section ({{.*}}) .rela.dyn {
 // CHECK-NEXT:     0x202000 R_X86_64_IRELATIVE
 // CHECK-NEXT:     0x202008 R_X86_64_IRELATIVE
 // CHECK-NEXT:   }
@@ -47,7 +47,7 @@
 // CHECK-NEXT:    Other [
 // CHECK-NEXT:      STV_HIDDEN
 // CHECK-NEXT:    ]
-// CHECK-NEXT:    Section: .rela.plt
+// CHECK-NEXT:    Section: .rela.dyn
 // CHECK-NEXT:  }
 // CHECK-NEXT:  Symbol {
 // CHECK-NEXT:    Name: __rela_iplt_start
@@ -58,7 +58,7 @@
 // CHECK-NEXT:    Other [
 // CHECK-NEXT:      STV_HIDDEN
 // CHECK-NEXT:    ]
-// CHECK-NEXT:    Section: .rela.plt
+// CHECK-NEXT:    Section: .rela.dyn
 // CHECK-NEXT:  }
 // CHECK-NEXT:  Symbol {
 // CHECK-NEXT:    Name: _start

Modified: lld/trunk/test/ELF/linkerscript/orphan-report.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/linkerscript/orphan-report.s?rev=367745&r1=367744&r2=367745&view=diff
==============================================================================
--- lld/trunk/test/ELF/linkerscript/orphan-report.s (original)
+++ lld/trunk/test/ELF/linkerscript/orphan-report.s Fri Aug  2 19:26:52 2019
@@ -32,7 +32,7 @@
 # REPORT-NEXT: <internal>:(.got.plt) is being placed in '.got.plt'
 # REPORT-NEXT: <internal>:(.got.plt) is being placed in '.got.plt'
 # REPORT-NEXT: <internal>:(.rela.plt) is being placed in '.rela.plt'
-# REPORT-NEXT: <internal>:(.rela.plt) is being placed in '.rela.plt'
+# REPORT-NEXT: <internal>:(.rela.dyn) is being placed in '.rela.dyn'
 # REPORT-NEXT: <internal>:(.plt) is being placed in '.plt'
 # REPORT-NEXT: <internal>:(.plt) is being placed in '.plt'
 # REPORT-NEXT: <internal>:(.symtab) is being placed in '.symtab'

Modified: lld/trunk/test/ELF/ppc32-gnu-ifunc-nonpreemptable.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/ppc32-gnu-ifunc-nonpreemptable.s?rev=367745&r1=367744&r2=367745&view=diff
==============================================================================
--- lld/trunk/test/ELF/ppc32-gnu-ifunc-nonpreemptable.s (original)
+++ lld/trunk/test/ELF/ppc32-gnu-ifunc-nonpreemptable.s Fri Aug  2 19:26:52 2019
@@ -6,7 +6,7 @@
 # RUN: llvm-readelf -x .got2 %t | FileCheck --check-prefix=HEX %s
 # RUN: llvm-objdump -d --no-show-raw-insn %t | FileCheck %s
 
-# RELOC:      .rela.plt {
+# RELOC:      .rela.dyn {
 # RELOC-NEXT:   0x10020004 R_PPC_IRELATIVE - 0x10010000
 # RELOC-NEXT: }
 

Modified: lld/trunk/test/ELF/ppc32-gnu-ifunc.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/ppc32-gnu-ifunc.s?rev=367745&r1=367744&r2=367745&view=diff
==============================================================================
--- lld/trunk/test/ELF/ppc32-gnu-ifunc.s (original)
+++ lld/trunk/test/ELF/ppc32-gnu-ifunc.s Fri Aug  2 19:26:52 2019
@@ -5,11 +5,11 @@
 # RUN: llvm-readelf -S -s %t | FileCheck --check-prefixes=SEC,SYM %s
 # RUN: llvm-objdump -d --no-show-raw-insn %t | FileCheck %s
 
-# RELOC:      .rela.plt {
+# RELOC:      .rela.dyn {
 # RELOC-NEXT:   0x10020000 R_PPC_IRELATIVE - 0x10010000
 # RELOC-NEXT: }
 
-# SEC: .rela.plt RELA 100000d4 0000d4 00000c
+# SEC: .rela.dyn RELA 100000d4 0000d4 00000c
 # SYM: 10010000 0 FUNC GLOBAL DEFAULT {{.*}} func
 
 # CHECK:      func_resolver:

Modified: lld/trunk/test/ELF/ppc64-ifunc.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/ppc64-ifunc.s?rev=367745&r1=367744&r2=367745&view=diff
==============================================================================
--- lld/trunk/test/ELF/ppc64-ifunc.s (original)
+++ lld/trunk/test/ELF/ppc64-ifunc.s Fri Aug  2 19:26:52 2019
@@ -5,14 +5,14 @@
 # RUN: llvm-nm %t | FileCheck --check-prefix=NM %s
 # RUN: llvm-readelf -S %t | FileCheck --check-prefix=SECTIONS %s
 # RUN: llvm-objdump -d --no-show-raw-insn %t | FileCheck %s
-# RUN: llvm-readelf -r %t | FileCheck --check-prefix=DYNREL %s
+# RUN: llvm-readobj -r %t | FileCheck --check-prefix=REL %s
 
 # RUN: llvm-mc -filetype=obj -triple=powerpc64-unknown-linux %s -o %t.o
 # RUN: ld.lld %t.o -o %t
 # RUN: llvm-nm %t | FileCheck --check-prefix=NM %s
 # RUN: llvm-readelf -S %t | FileCheck --check-prefix=SECTIONS %s
 # RUN: llvm-objdump -d --no-show-raw-insn %t | FileCheck %s
-# RUN: llvm-readelf -r %t | FileCheck --check-prefix=DYNREL %s
+# RUN: llvm-readobj -r %t | FileCheck --check-prefix=REL %s
 
 # NM-DAG: 0000000010028000 d .TOC.
 # NM-DAG: 0000000010010000 T ifunc
@@ -46,9 +46,12 @@
 # CHECK-NEXT:     mtctr 12
 # CHECK-NEXT:     bctr
 
-# Check that we emit 2 R_PPC64_IRELATIVE.
-# DYNREL: R_PPC64_IRELATIVE       10010000
-# DYNREL: R_PPC64_IRELATIVE       10010004
+## Check that we emit 2 R_PPC64_IRELATIVE in .rela.dyn.
+## glibc powerpc64 does not eagerly resolve R_PPC64_IRELATIVE if they are in .rela.plt.
+# REL:      .rela.dyn {
+# REL-NEXT:   0x10030000 R_PPC64_IRELATIVE - 0x10010000
+# REL-NEXT:   0x10030008 R_PPC64_IRELATIVE - 0x10010004
+# REL-NEXT: }
 
 .type ifunc STT_GNU_IFUNC
 .globl ifunc




More information about the llvm-commits mailing list