summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lld/ELF/OutputSections.cpp24
-rw-r--r--lld/ELF/OutputSections.h3
-rw-r--r--lld/ELF/Writer.cpp19
-rw-r--r--lld/test/elf2/plt-i686.s14
-rw-r--r--lld/test/elf2/plt.s16
-rw-r--r--lld/test/elf2/relocation.s8
6 files changed, 29 insertions, 55 deletions
diff --git a/lld/ELF/OutputSections.cpp b/lld/ELF/OutputSections.cpp
index f0956526ac8..af2e637b6b4 100644
--- a/lld/ELF/OutputSections.cpp
+++ b/lld/ELF/OutputSections.cpp
@@ -48,10 +48,6 @@ template <> RelocationSection<ELF32BE> *Out<ELF32BE>::RelaDyn = nullptr;
template <> RelocationSection<ELF32LE> *Out<ELF32LE>::RelaDyn = nullptr;
template <> RelocationSection<ELF64BE> *Out<ELF64BE>::RelaDyn = nullptr;
template <> RelocationSection<ELF64LE> *Out<ELF64LE>::RelaDyn = nullptr;
-template <> RelocationSection<ELF32BE> *Out<ELF32BE>::RelaPlt = nullptr;
-template <> RelocationSection<ELF32LE> *Out<ELF32LE>::RelaPlt = nullptr;
-template <> RelocationSection<ELF64BE> *Out<ELF64BE>::RelaPlt = nullptr;
-template <> RelocationSection<ELF64LE> *Out<ELF64LE>::RelaPlt = nullptr;
template <> StringTableSection<false> *Out<ELF32BE>::DynStrTab = nullptr;
template <> StringTableSection<false> *Out<ELF32LE>::DynStrTab = nullptr;
template <> StringTableSection<true> *Out<ELF64BE>::DynStrTab = nullptr;
@@ -143,9 +139,10 @@ void PltSection<ELFT>::finalize() {
}
template <class ELFT>
-RelocationSection<ELFT>::RelocationSection(StringRef Name, bool IsRela)
- : OutputSectionBase<ELFT::Is64Bits>(Name, IsRela ? llvm::ELF::SHT_RELA
- : llvm::ELF::SHT_REL,
+RelocationSection<ELFT>::RelocationSection(bool IsRela)
+ : OutputSectionBase<ELFT::Is64Bits>(IsRela ? ".rela.dyn" : ".rel.dyn",
+ IsRela ? llvm::ELF::SHT_RELA
+ : llvm::ELF::SHT_REL,
llvm::ELF::SHF_ALLOC),
IsRela(IsRela) {
this->Header.sh_entsize = IsRela ? sizeof(Elf_Rela) : sizeof(Elf_Rel);
@@ -303,13 +300,6 @@ template <class ELFT> void DynamicSection<ELFT>::finalize() {
++NumEntries; // DT_RELASZ / DT_RELSZ
++NumEntries; // DT_RELAENT / DT_RELENT
}
- if (Out<ELFT>::RelaPlt->hasRelocs()) {
- ++NumEntries; // DT_JMPREL
- ++NumEntries; // DT_PLTRELSZ
- ++NumEntries; // DT_PLTGOT
- ++NumEntries; // DT_PLTREL
- }
-
++NumEntries; // DT_SYMTAB
++NumEntries; // DT_SYMENT
++NumEntries; // DT_STRTAB
@@ -377,12 +367,6 @@ template <class ELFT> void DynamicSection<ELFT>::writeTo(uint8_t *Buf) {
WriteVal(IsRela ? DT_RELAENT : DT_RELENT,
IsRela ? sizeof(Elf_Rela) : sizeof(Elf_Rel));
}
- if (Out<ELFT>::RelaPlt->hasRelocs()) {
- WritePtr(DT_JMPREL, Out<ELFT>::RelaPlt->getVA());
- WriteVal(DT_PLTRELSZ, Out<ELFT>::RelaPlt->getSize());
- WritePtr(DT_PLTGOT, Out<ELFT>::Got->getVA());
- WriteVal(DT_PLTREL, Out<ELFT>::RelaPlt->isRela() ? DT_RELA : DT_REL);
- }
WritePtr(DT_SYMTAB, Out<ELFT>::DynSymTab->getVA());
WritePtr(DT_SYMENT, sizeof(Elf_Sym));
diff --git a/lld/ELF/OutputSections.h b/lld/ELF/OutputSections.h
index 7c00aa39d36..8e789566e2f 100644
--- a/lld/ELF/OutputSections.h
+++ b/lld/ELF/OutputSections.h
@@ -171,7 +171,7 @@ class RelocationSection final : public OutputSectionBase<ELFT::Is64Bits> {
typedef typename llvm::object::ELFFile<ELFT>::uintX_t uintX_t;
public:
- RelocationSection(StringRef Name, bool IsRela);
+ RelocationSection(bool IsRela);
void addReloc(const DynamicReloc<ELFT> &Reloc) { Relocs.push_back(Reloc); }
void finalize() override;
void writeTo(uint8_t *Buf) override;
@@ -289,7 +289,6 @@ template <class ELFT> struct Out {
static OutputSection<ELFT> *Bss;
static PltSection<ELFT> *Plt;
static RelocationSection<ELFT> *RelaDyn;
- static RelocationSection<ELFT> *RelaPlt;
static StringTableSection<ELFT::Is64Bits> *DynStrTab;
static StringTableSection<ELFT::Is64Bits> *StrTab;
static SymbolTableSection<ELFT> *DynSymTab;
diff --git a/lld/ELF/Writer.cpp b/lld/ELF/Writer.cpp
index a88a7d43fc7..0688a5bf28b 100644
--- a/lld/ELF/Writer.cpp
+++ b/lld/ELF/Writer.cpp
@@ -134,11 +134,8 @@ template <class ELFT> static void doWriteResult(SymbolTable *Symtab) {
Out<ELFT>::DynSymTab = &DynSymTab;
HashTableSection<ELFT> HashTab;
Out<ELFT>::HashTab = &HashTab;
- bool IsRela = Symtab->shouldUseRela();
- RelocationSection<ELFT> RelaDyn(IsRela ? ".rela.dyn" : ".rel.dyn", IsRela);
+ RelocationSection<ELFT> RelaDyn(Symtab->shouldUseRela());
Out<ELFT>::RelaDyn = &RelaDyn;
- RelocationSection<ELFT> RelaPlt(IsRela ? ".rela.plt" : ".rel.plt", IsRela);
- Out<ELFT>::RelaPlt = &RelaPlt;
DynamicSection<ELFT> Dynamic(*Symtab);
Out<ELFT>::Dynamic = &Dynamic;
@@ -236,15 +233,11 @@ void Writer<ELFT>::scanRelocs(
Out<ELFT>::Got->addEntry(Body);
}
}
-
- bool CanBePreempted = canBePreempted(Body);
- if (CanBePreempted)
+ if (canBePreempted(Body)) {
Body->setUsedInDynamicReloc();
- if (CanBePreempted || (Config->Shared && !Target->isRelRelative(Type))) {
- if (Body && Body->isInPlt())
- Out<ELFT>::RelaPlt->addReloc({C, RI});
- else
- Out<ELFT>::RelaDyn->addReloc({C, RI});
+ Out<ELFT>::RelaDyn->addReloc({C, RI});
+ } else if (Config->Shared && !Target->isRelRelative(Type)) {
+ Out<ELFT>::RelaDyn->addReloc({C, RI});
}
}
}
@@ -473,8 +466,6 @@ template <class ELFT> void Writer<ELFT>::createSections() {
OutputSections.push_back(Out<ELFT>::DynStrTab);
if (Out<ELFT>::RelaDyn->hasRelocs())
OutputSections.push_back(Out<ELFT>::RelaDyn);
- if (Out<ELFT>::RelaPlt->hasRelocs())
- OutputSections.push_back(Out<ELFT>::RelaPlt);
}
if (!Out<ELFT>::Got->empty())
OutputSections.push_back(Out<ELFT>::Got);
diff --git a/lld/test/elf2/plt-i686.s b/lld/test/elf2/plt-i686.s
index 9eb9401c90d..006851ffd2d 100644
--- a/lld/test/elf2/plt-i686.s
+++ b/lld/test/elf2/plt-i686.s
@@ -20,9 +20,9 @@
// CHECK-NEXT: AddressAlignment: 16
// CHECK: Relocations [
-// CHECK-NEXT: Section ({{.*}}) .rel.plt {
-// CHECK-NEXT: 0x13058 R_386_GLOB_DAT bar 0x0
-// CHECK-NEXT: 0x1305C R_386_GLOB_DAT zed 0x0
+// CHECK-NEXT: Section ({{.*}}) .rel.dyn {
+// CHECK-NEXT: 0x13050 R_386_GLOB_DAT bar 0x0
+// CHECK-NEXT: 0x13054 R_386_GLOB_DAT zed 0x0
// CHECK-NEXT: }
// CHECK-NEXT: ]
@@ -38,15 +38,15 @@
// DISASM-NEXT: 12005: e9 06 00 00 00 jmp 6
// DISASM-NEXT: 1200a: e9 09 00 00 00 jmp 9
-// 0x13058 = 77912
-// 0x1305C = 77916
+// 0x13050 = 77904
+// 0x13054 = 77908
// DISASM: Disassembly of section .plt:
// DISASM-NEXT: .plt:
-// DISASM-NEXT: 12010: ff 25 {{.*}} jmpl *77912
+// DISASM-NEXT: 12010: ff 25 {{.*}} jmpl *77904
// DISASM-NEXT: 12016: 90 nop
// DISASM-NEXT: 12017: 90 nop
-// DISASM-NEXT: 12018: ff 25 {{.*}} jmpl *77916
+// DISASM-NEXT: 12018: ff 25 {{.*}} jmpl *77908
// DISASM-NEXT: 1201e: 90 nop
// DISASM-NEXT: 1201f: 90 nop
diff --git a/lld/test/elf2/plt.s b/lld/test/elf2/plt.s
index 1176956abe1..bf54ca23683 100644
--- a/lld/test/elf2/plt.s
+++ b/lld/test/elf2/plt.s
@@ -20,10 +20,10 @@
// CHECK-NEXT: AddressAlignment: 16
// CHECK: Relocations [
-// CHECK-NEXT: Section ({{.*}}) .rela.plt {
-// CHECK-NEXT: 0x30B0 R_X86_64_GLOB_DAT bar 0x0
-// CHECK-NEXT: 0x30B8 R_X86_64_GLOB_DAT zed 0x0
-// CHECK-NEXT: 0x30C0 R_X86_64_GLOB_DAT _start 0x0
+// CHECK-NEXT: Section ({{.*}}) .rela.dyn {
+// CHECK-NEXT: 0x30A0 R_X86_64_GLOB_DAT bar 0x0
+// CHECK-NEXT: 0x30A8 R_X86_64_GLOB_DAT zed 0x0
+// CHECK-NEXT: 0x30B0 R_X86_64_GLOB_DAT _start 0x0
// CHECK-NEXT: }
// CHECK-NEXT: ]
@@ -39,15 +39,15 @@
// DISASM-NEXT: 2005: e9 {{.*}} jmp 22
// DISASM-NEXT: 200a: e9 {{.*}} jmp 25
-// 0x30B0 - 0x2026 = 4234
-// 0x30B8 - 0x202e = 4234
+// 0x130A0 - 0x12026 = 4218
+// 0x130A8 - 0x1202e = 4218
// DISASM: Disassembly of section .plt:
// DISASM-NEXT: .plt:
-// DISASM-NEXT: 2020: ff 25 {{.*}} jmpq *4234(%rip)
+// DISASM-NEXT: 2020: ff 25 {{.*}} jmpq *4218(%rip)
// DISASM-NEXT: 2026: 90 nop
// DISASM-NEXT: 2027: 90 nop
-// DISASM-NEXT: 2028: ff 25 {{.*}} jmpq *4234(%rip)
+// DISASM-NEXT: 2028: ff 25 {{.*}} jmpq *4218(%rip)
// DISASM-NEXT: 202e: 90 nop
// DISASM-NEXT: 202f: 90 nop
diff --git a/lld/test/elf2/relocation.s b/lld/test/elf2/relocation.s
index e4d90ea7e87..35f7e305881 100644
--- a/lld/test/elf2/relocation.s
+++ b/lld/test/elf2/relocation.s
@@ -22,7 +22,7 @@
// SEC-NEXT: SHF_ALLOC
// SEC-NEXT: SHF_WRITE
// SEC-NEXT: ]
-// SEC-NEXT: Address: 0x130E0
+// SEC-NEXT: Address: 0x130A0
// SEC-NEXT: Offset:
// SEC-NEXT: Size: 16
// SEC-NEXT: Link: 0
@@ -93,7 +93,7 @@ R_X86_64_64:
R_X86_64_GOTPCREL:
.long zed@gotpcrel
-// 0x130E8 - 0x11008 = 8416
-// 8416 = 0xE0200000 in little endian
+// 0x130A8 - 0x11008 = 8352
+// 8352 = 0x80200000 in little endian
// CHECK: Contents of section .R_X86_64_GOTPCREL
-// CHECK-NEXT: 11008 e0200000
+// CHECK-NEXT: 11008 a0200000
OpenPOWER on IntegriCloud