diff options
-rw-r--r-- | lld/ELF/Arch/Mips.cpp | 1 | ||||
-rw-r--r-- | lld/ELF/Arch/PPC.cpp | 7 | ||||
-rw-r--r-- | lld/ELF/Arch/X86.cpp | 1 | ||||
-rw-r--r-- | lld/ELF/Arch/X86_64.cpp | 1 | ||||
-rw-r--r-- | lld/ELF/SyntheticSections.cpp | 13 | ||||
-rw-r--r-- | lld/ELF/SyntheticSections.h | 2 | ||||
-rw-r--r-- | lld/ELF/Target.h | 5 | ||||
-rw-r--r-- | lld/ELF/Writer.cpp | 11 | ||||
-rw-r--r-- | lld/test/ELF/arm-got-relative.s | 10 | ||||
-rw-r--r-- | lld/test/ELF/dynamic-got.s | 27 | ||||
-rw-r--r-- | lld/test/ELF/global-offset-table-position-aarch64.s | 4 | ||||
-rw-r--r-- | lld/test/ELF/global-offset-table-position-arm.s | 7 | ||||
-rw-r--r-- | lld/test/ELF/global-offset-table-position-i386.s | 7 | ||||
-rw-r--r-- | lld/test/ELF/global-offset-table-position.s | 7 | ||||
-rw-r--r-- | lld/test/ELF/global_offset_table_shared.s | 4 | ||||
-rw-r--r-- | lld/test/ELF/got32x-i386.s | 6 | ||||
-rw-r--r-- | lld/test/ELF/i386-gotpc.s | 14 |
17 files changed, 42 insertions, 85 deletions
diff --git a/lld/ELF/Arch/Mips.cpp b/lld/ELF/Arch/Mips.cpp index d8631b574c3..fcf5affb09e 100644 --- a/lld/ELF/Arch/Mips.cpp +++ b/lld/ELF/Arch/Mips.cpp @@ -50,7 +50,6 @@ template <class ELFT> MIPS<ELFT>::MIPS() { DefaultMaxPageSize = 65536; GotEntrySize = sizeof(typename ELFT::uint); GotPltEntrySize = sizeof(typename ELFT::uint); - GotBaseSymInGotPlt = false; PltEntrySize = 16; PltHeaderSize = 32; CopyRel = R_MIPS_COPY; diff --git a/lld/ELF/Arch/PPC.cpp b/lld/ELF/Arch/PPC.cpp index 20cae0e59cf..6af0df331df 100644 --- a/lld/ELF/Arch/PPC.cpp +++ b/lld/ELF/Arch/PPC.cpp @@ -21,18 +21,13 @@ using namespace lld::elf; namespace { class PPC final : public TargetInfo { public: - PPC(); + PPC() { GotBaseSymOff = 0x8000; } void relocateOne(uint8_t *Loc, RelType Type, uint64_t Val) const override; RelExpr getRelExpr(RelType Type, const Symbol &S, const uint8_t *Loc) const override; }; } // namespace -PPC::PPC() { - GotBaseSymOff = 0x8000; - GotBaseSymInGotPlt = false; -} - RelExpr PPC::getRelExpr(RelType Type, const Symbol &S, const uint8_t *Loc) const { switch (Type) { diff --git a/lld/ELF/Arch/X86.cpp b/lld/ELF/Arch/X86.cpp index e638feb259d..bbaa3419a66 100644 --- a/lld/ELF/Arch/X86.cpp +++ b/lld/ELF/Arch/X86.cpp @@ -46,6 +46,7 @@ public: } // namespace X86::X86() { + GotBaseSymOff = -1; CopyRel = R_386_COPY; GotRel = R_386_GLOB_DAT; PltRel = R_386_JUMP_SLOT; diff --git a/lld/ELF/Arch/X86_64.cpp b/lld/ELF/Arch/X86_64.cpp index 512b1ffdf38..f6f5038d87c 100644 --- a/lld/ELF/Arch/X86_64.cpp +++ b/lld/ELF/Arch/X86_64.cpp @@ -51,6 +51,7 @@ private: } // namespace template <class ELFT> X86_64<ELFT>::X86_64() { + GotBaseSymOff = -1; CopyRel = R_X86_64_COPY; GotRel = R_X86_64_GLOB_DAT; PltRel = R_X86_64_JUMP_SLOT; diff --git a/lld/ELF/SyntheticSections.cpp b/lld/ELF/SyntheticSections.cpp index ef7944c8100..f5fa0731e6b 100644 --- a/lld/ELF/SyntheticSections.cpp +++ b/lld/ELF/SyntheticSections.cpp @@ -626,9 +626,8 @@ void GotSection::finalizeContents() { Size = NumEntries * Config->Wordsize; } bool GotSection::empty() const { // We need to emit a GOT even if it's empty if there's a relocation that is // relative to GOT(such as GOTOFFREL) or there's a symbol that points to a GOT - // (i.e. _GLOBAL_OFFSET_TABLE_) that the target defines relative to the .got. - return NumEntries == 0 && !HasGotOffRel && - !(ElfSym::GlobalOffsetTable && !Target->GotBaseSymInGotPlt); + // (i.e. _GLOBAL_OFFSET_TABLE_). + return NumEntries == 0 && !HasGotOffRel && !ElfSym::GlobalOffsetTable; } void GotSection::writeTo(uint8_t *Buf) { @@ -899,14 +898,6 @@ void GotPltSection::writeTo(uint8_t *Buf) { } } -bool GotPltSection::empty() const { - // We need to emit a GOT.PLT even if it's empty if there's a symbol that - // references the _GLOBAL_OFFSET_TABLE_ and the Target defines the symbol - // relative to the .got.plt section. - return Entries.empty() && - !(ElfSym::GlobalOffsetTable && Target->GotBaseSymInGotPlt); -} - // On ARM the IgotPltSection is part of the GotSection, on other Targets it is // part of the .got.plt IgotPltSection::IgotPltSection() diff --git a/lld/ELF/SyntheticSections.h b/lld/ELF/SyntheticSections.h index 23deb03c9ee..7f23d8282b6 100644 --- a/lld/ELF/SyntheticSections.h +++ b/lld/ELF/SyntheticSections.h @@ -270,7 +270,7 @@ public: void addEntry(Symbol &Sym); size_t getSize() const override; void writeTo(uint8_t *Buf) override; - bool empty() const override; + bool empty() const override { return Entries.empty(); } private: std::vector<const Symbol *> Entries; diff --git a/lld/ELF/Target.h b/lld/ELF/Target.h index b0970097ee8..e29c9f4250c 100644 --- a/lld/ELF/Target.h +++ b/lld/ELF/Target.h @@ -75,10 +75,9 @@ public: uint64_t getImageBase(); - // Offset of _GLOBAL_OFFSET_TABLE_ from base of .got or .got.plt section. + // Offset of _GLOBAL_OFFSET_TABLE_ from base of .got section. Use -1 for + // end of .got uint64_t GotBaseSymOff = 0; - // True if _GLOBAL_OFFSET_TABLE_ is relative to .got.plt, false if .got. - bool GotBaseSymInGotPlt = true; // On systems with range extensions we place collections of Thunks at // regular spacings that enable the majority of branches reach the Thunks. diff --git a/lld/ELF/Writer.cpp b/lld/ELF/Writer.cpp index 2490d1d5aec..a088cc5eb68 100644 --- a/lld/ELF/Writer.cpp +++ b/lld/ELF/Writer.cpp @@ -869,12 +869,11 @@ void Writer<ELFT>::forEachRelSec(std::function<void(InputSectionBase &)> Fn) { // defining these symbols explicitly in the linker script. template <class ELFT> void Writer<ELFT>::setReservedSymbolSections() { if (ElfSym::GlobalOffsetTable) { - // The _GLOBAL_OFFSET_TABLE_ symbol is defined by target convention usually - // to the start of the .got or .got.plt section. - InputSection *GotSection = InX::GotPlt; - if (!Target->GotBaseSymInGotPlt) - GotSection = InX::MipsGot ? cast<InputSection>(InX::MipsGot) - : cast<InputSection>(InX::Got); + // The _GLOBAL_OFFSET_TABLE_ symbol is defined by target convention to + // be at some offset from the base of the .got section, usually 0 or the end + // of the .got + InputSection *GotSection = InX::MipsGot ? cast<InputSection>(InX::MipsGot) + : cast<InputSection>(InX::Got); ElfSym::GlobalOffsetTable->Section = GotSection; } diff --git a/lld/test/ELF/arm-got-relative.s b/lld/test/ELF/arm-got-relative.s index c64969d759c..cf8b0a64a96 100644 --- a/lld/test/ELF/arm-got-relative.s +++ b/lld/test/ELF/arm-got-relative.s @@ -28,17 +28,17 @@ function: bx lr // CHECK: Dynamic Relocations { -// CHECK-NEXT: 0x3048 R_ARM_GLOB_DAT function 0x0 +// CHECK-NEXT: 0x2048 R_ARM_GLOB_DAT function 0x0 // CHECK: Name: _GLOBAL_OFFSET_TABLE_ -// CHECK-NEXT: Value: 0x2000 +// CHECK-NEXT: Value: 0x2048 // CHECK-NEXT: Size: // CHECK-NEXT: Binding: Local // CHECK-NEXT: Type: None // CHECK-NEXT: Other [ // CHECK-NEXT: STV_HIDDEN // CHECK-NEXT: ] -// CHECK-NEXT: Section: .got.plt +// CHECK-NEXT: Section: .got // CODE: Disassembly of section .text: // CODE-NEXT: _start: @@ -47,7 +47,7 @@ function: // CODE-NEXT: 1008: 03 00 8f e0 add r0, pc, r3 // CODE-NEXT: 100c: 1e ff 2f e1 bx lr // CODE:$d.1: -// (_GLOBAL_OFFSET_TABLE_ = 0x2000) - (0x1008 + 8) = 0xff0 -// CODE-NEXT: 1010: f0 0f 00 00 +// (_GLOBAL_OFFSET_TABLE_ = 0x2048) - (0x1008 + 8) 0x1038 +// CODE-NEXT: 1010: 38 10 00 00 // (Got(function) - GotBase = 0x0 // CODE-NEXT: 1014: 00 00 00 00 diff --git a/lld/test/ELF/dynamic-got.s b/lld/test/ELF/dynamic-got.s index 844e4f48b3f..385394b9d34 100644 --- a/lld/test/ELF/dynamic-got.s +++ b/lld/test/ELF/dynamic-got.s @@ -3,23 +3,6 @@ // RUN: ld.lld --hash-style=sysv %t.o -o %t.so -shared // RUN: llvm-readobj -s -l -section-data -r %t.so | FileCheck %s -// CHECK: Name: .got.plt -// CHECK-NEXT: Type: SHT_PROGBITS -// CHECK-NEXT: Flags [ -// CHECK-NEXT: SHF_ALLOC -// CHECK-NEXT: SHF_WRITE -// CHECK-NEXT: ] -// CHECK-NEXT: Address: -// CHECK-NEXT: Offset: -// CHECK-NEXT: Size: -// CHECK-NEXT: Link: -// CHECK-NEXT: Info: -// CHECK-NEXT: AddressAlignment: -// CHECK-NEXT: EntrySize: -// CHECK-NEXT: SectionData ( -// CHECK-NEXT: 0000: 00300000 00000000 00000000 -// CHECK-NEXT: ) - // CHECK: Name: .got // CHECK-NEXT: Type: SHT_PROGBITS // CHECK-NEXT: Flags [ @@ -34,19 +17,19 @@ // CHECK-NEXT: AddressAlignment: // CHECK-NEXT: EntrySize: // CHECK-NEXT: SectionData ( -// CHECK-NEXT: 0000: 00300000 +// CHECK-NEXT: 0000: 00200000 | // CHECK-NEXT: ) // CHECK: Relocations [ // CHECK-NEXT: Section ({{.*}}) .rel.dyn { -// CHECK-NEXT: 0x3050 R_386_RELATIVE - 0x0 +// CHECK-NEXT: 0x2050 R_386_RELATIVE - 0x0 // CHECK-NEXT: } // CHECK-NEXT: ] // CHECK: Type: PT_DYNAMIC -// CHECK-NEXT: Offset: 0x3000 -// CHECK-NEXT: VirtualAddress: 0x3000 -// CHECK-NEXT: PhysicalAddress: 0x3000 +// CHECK-NEXT: Offset: 0x2000 +// CHECK-NEXT: VirtualAddress: 0x2000 +// CHECK-NEXT: PhysicalAddress: 0x2000 calll .L0$pb .L0$pb: diff --git a/lld/test/ELF/global-offset-table-position-aarch64.s b/lld/test/ELF/global-offset-table-position-aarch64.s index 8e26913dc73..68bc4a4254e 100644 --- a/lld/test/ELF/global-offset-table-position-aarch64.s +++ b/lld/test/ELF/global-offset-table-position-aarch64.s @@ -20,11 +20,11 @@ _start: .long _GLOBAL_OFFSET_TABLE_ - . // CHECK: Name: _GLOBAL_OFFSET_TABLE_ (11) -// CHECK-NEXT: Value: 0x20008 +// CHECK-NEXT: Value: 0x30090 // CHECK-NEXT: Size: 0 // CHECK-NEXT: Binding: Local (0x0) // CHECK-NEXT: Type: None (0x0) // CHECK-NEXT: Other [ (0x2) // CHECK-NEXT: STV_HIDDEN (0x2) // CHECK-NEXT: ] -// CHECK-NEXT: Section: .got.plt +// CHECK-NEXT: Section: .got diff --git a/lld/test/ELF/global-offset-table-position-arm.s b/lld/test/ELF/global-offset-table-position-arm.s index 05381293453..19619b2cc9e 100644 --- a/lld/test/ELF/global-offset-table-position-arm.s +++ b/lld/test/ELF/global-offset-table-position-arm.s @@ -3,8 +3,7 @@ // RUN: llvm-readobj -t %t2 | FileCheck %s // REQUIRES: arm -// The ARM _GLOBAL_OFFSET_TABLE_ should be defined at the start of the -// .got.plt section. +// The ARM _GLOBAL_OFFSET_TABLE_ should be defined at the start of the .got .globl a .type a,%object .comm a,4,4 @@ -26,11 +25,11 @@ _start: .data // CHECK: Name: _GLOBAL_OFFSET_TABLE_ -// CHECK-NEXT: Value: 0x2000 +// CHECK-NEXT: Value: 0x3068 // CHECK-NEXT: Size: 0 // CHECK-NEXT: Binding: Local // CHECK-NEXT: Type: None // CHECK-NEXT: Other [ (0x2) // CHECK-NEXT: STV_HIDDEN (0x2) // CHECK-NEXT: ] -// CHECK-NEXT: Section: .got.plt +// CHECK-NEXT: Section: .got diff --git a/lld/test/ELF/global-offset-table-position-i386.s b/lld/test/ELF/global-offset-table-position-i386.s index 8d50b4990e9..9f778e1efb5 100644 --- a/lld/test/ELF/global-offset-table-position-i386.s +++ b/lld/test/ELF/global-offset-table-position-i386.s @@ -3,8 +3,7 @@ // RUN: llvm-readobj -t %t2 | FileCheck %s // REQUIRES: x86 -// The X86 _GLOBAL_OFFSET_TABLE_ is defined at the start of the .got.plt -// section. +// The X86 _GLOBAL_OFFSET_TABLE_ is defined at the end of the .got section. .globl a .type a,@object .comm a,4,4 @@ -22,11 +21,11 @@ addl $_GLOBAL_OFFSET_TABLE_, %eax calll f@PLT // CHECK: Name: _GLOBAL_OFFSET_TABLE_ (1) -// CHECK-NEXT: Value: 0x2000 +// CHECK-NEXT: Value: 0x306C // CHECK-NEXT: Size: 0 // CHECK-NEXT: Binding: Local (0x0) // CHECK-NEXT: Type: None (0x0) // CHECK-NEXT: Other [ (0x2) // CHECK-NEXT: STV_HIDDEN (0x2) // CHECK-NEXT: ] -// CHECK-NEXT: Section: .got.plt +// CHECK-NEXT: Section: .got (0xA) diff --git a/lld/test/ELF/global-offset-table-position.s b/lld/test/ELF/global-offset-table-position.s index 57fe6c804d7..f1195b2cf67 100644 --- a/lld/test/ELF/global-offset-table-position.s +++ b/lld/test/ELF/global-offset-table-position.s @@ -3,8 +3,7 @@ // RUN: llvm-readobj -t %t2 | FileCheck %s // REQUIRES: x86 -// The X86_64 _GLOBAL_OFFSET_TABLE_ is defined at the start of the .got.plt -// section. +// The X86_64 _GLOBAL_OFFSET_TABLE_ is defined at the end of the .got section. .globl a .type a,@object .comm a,4,4 @@ -22,11 +21,11 @@ callq f@PLT .long _GLOBAL_OFFSET_TABLE_ - . // CHECK: Name: _GLOBAL_OFFSET_TABLE_ -// CHECK-NEXT: Value: 0x2008 +// CHECK-NEXT: Value: 0x30D8 // CHECK-NEXT: Size: 0 // CHECK-NEXT: Binding: Local // CHECK-NEXT: Type: None (0x0) // CHECK-NEXT: Other [ // CHECK-NEXT: STV_HIDDEN // CHECK-NEXT: ] -// CHECK-NEXT: Section: .got.plt +// CHECK-NEXT: Section: .got diff --git a/lld/test/ELF/global_offset_table_shared.s b/lld/test/ELF/global_offset_table_shared.s index 06bd7b3cd7a..03af02e5805 100644 --- a/lld/test/ELF/global_offset_table_shared.s +++ b/lld/test/ELF/global_offset_table_shared.s @@ -4,11 +4,11 @@ .long _GLOBAL_OFFSET_TABLE_ - . // CHECK: Name: _GLOBAL_OFFSET_TABLE_ -// CHECK-NEXT: Value: 0x2000 +// CHECK-NEXT: Value: 0x2060 // CHECK-NEXT: Size: 0 // CHECK-NEXT: Binding: Local // CHECK-NEXT: Type: None // CHECK-NEXT: Other [ (0x2) // CHECK-NEXT: STV_HIDDEN (0x2) // CHECK-NEXT: ] -// CHECK-NEXT: Section: .got.plt +// CHECK-NEXT: Section: .got diff --git a/lld/test/ELF/got32x-i386.s b/lld/test/ELF/got32x-i386.s index 610051e8a96..dd0b895c364 100644 --- a/lld/test/ELF/got32x-i386.s +++ b/lld/test/ELF/got32x-i386.s @@ -33,13 +33,13 @@ ## 73728 == 0x12000 == ADDR(.got) # CHECK: _start: -# CHECK-NEXT: 11001: 8b 05 {{.*}} movl 77824, %eax -# CHECK-NEXT: 11007: 8b 1d {{.*}} movl 77824, %ebx +# CHECK-NEXT: 11001: 8b 05 {{.*}} movl 73728, %eax +# CHECK-NEXT: 11007: 8b 1d {{.*}} movl 73728, %ebx # CHECK-NEXT: 1100d: 8b 80 {{.*}} movl -4(%eax), %eax # CHECK-NEXT: 11013: 8b 83 {{.*}} movl -4(%ebx), %eax # CHECK: Sections: # CHECK: Name Size Address -# CHECK: .got 00000004 0000000000013000 +# CHECK: .got 00000004 0000000000012000 # RUN: not ld.lld %S/Inputs/i386-got32x-baseless.elf -o %t1 -pie 2>&1 | \ # RUN: FileCheck %s --check-prefix=ERR diff --git a/lld/test/ELF/i386-gotpc.s b/lld/test/ELF/i386-gotpc.s index af8380b9115..d2c5ef3d469 100644 --- a/lld/test/ELF/i386-gotpc.s +++ b/lld/test/ELF/i386-gotpc.s @@ -6,23 +6,15 @@ movl $_GLOBAL_OFFSET_TABLE_, %eax -// CHECK: Name: .got.plt -// CHECK-NEXT: Type: SHT_PROGBITS -// CHECK-NEXT: Flags [ -// CHECK-NEXT: SHF_ALLOC -// CHECK-NEXT: SHF_WRITE -// CHECK-NEXT: ] -// CHECK-NEXT: Address: 0x2000 - // CHECK: Name: .got // CHECK-NEXT: Type: SHT_PROGBITS // CHECK-NEXT: Flags [ // CHECK-NEXT: SHF_ALLOC // CHECK-NEXT: SHF_WRITE // CHECK-NEXT: ] -// CHECK-NEXT: Address: 0x3030 +// CHECK-NEXT: Address: 0x2030 // DISASM: Disassembly of section .text: // DISASM-NEXT: .text: -// DISASM-NEXT: 1000: {{.*}} movl $8240, %eax -// 0x3030 - 0x1000 = 0x2030 +// DISASM-NEXT: 1000: {{.*}} movl $4144, %eax +// 0x2030 - 0x1000 = 4144 |