Index: lld/trunk/ELF/SyntheticSections.cpp =================================================================== --- lld/trunk/ELF/SyntheticSections.cpp +++ lld/trunk/ELF/SyntheticSections.cpp @@ -587,10 +587,18 @@ GotSection::GotSection() : SyntheticSection(SHF_ALLOC | SHF_WRITE, SHT_PROGBITS, - Target->GotEntrySize, ".got") {} + Target->GotEntrySize, ".got") { + // PPC64 saves the ElfSym::GlobalOffsetTable .TOC. as the first entry in the + // .got. If there are no references to .TOC. in the symbol table, + // ElfSym::GlobalOffsetTable will not be defined and we won't need to save + // .TOC. in the .got. When it is defined, we increase NumEntries by the number + // of entries used to emit ElfSym::GlobalOffsetTable. + if (ElfSym::GlobalOffsetTable && !Target->GotBaseSymInGotPlt) + NumEntries += Target->GotHeaderEntriesNum; +} void GotSection::addEntry(Symbol &Sym) { - Sym.GotIndex = Target->GotHeaderEntriesNum + NumEntries; + Sym.GotIndex = NumEntries; ++NumEntries; } @@ -622,7 +630,7 @@ } void GotSection::finalizeContents() { - Size = (NumEntries + Target->GotHeaderEntriesNum) * Config->Wordsize; + Size = NumEntries * Config->Wordsize; } bool GotSection::empty() const { Index: lld/trunk/test/ELF/ppc64_entry_point.s =================================================================== --- lld/trunk/test/ELF/ppc64_entry_point.s +++ lld/trunk/test/ELF/ppc64_entry_point.s @@ -1,7 +1,7 @@ # REQUIRES: ppc # RUN: llvm-mc -filetype=obj -triple=powerpc64le-unknown-linux %s -o %t # RUN: ld.lld %t -o %t2 -# RUN: llvm-objdump -d %t2 | FileCheck %s +# RUN: llvm-objdump -D %t2 | FileCheck %s .text .abiversion 2 @@ -31,3 +31,6 @@ // CHECK-NEXT: 10010004: 00 00 84 38 addi 4, 4, 0 // CHECK-NEXT: 10010008: 02 00 a0 3c lis 5, 2 // CHECK-NEXT: 1001000c: 00 80 a5 38 addi 5, 5, -32768 +// CHECK: Disassembly of section .got: +// CHECK-NEXT: .got: +// CHECK-NEXT: 10020000: 00 80 02 10