[lld] r268945 - Document and test the first few .got.plt entries.

Rafael Espindola via llvm-commits llvm-commits at lists.llvm.org
Mon May 9 11:12:15 PDT 2016


Author: rafael
Date: Mon May  9 13:12:15 2016
New Revision: 268945

URL: http://llvm.org/viewvc/llvm-project?rev=268945&view=rev
Log:
Document and test the first few .got.plt entries.

Added:
    lld/trunk/test/ELF/got-plt-header.s
Modified:
    lld/trunk/ELF/Target.cpp
    lld/trunk/ELF/Target.h

Modified: lld/trunk/ELF/Target.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Target.cpp?rev=268945&r1=268944&r2=268945&view=diff
==============================================================================
--- lld/trunk/ELF/Target.cpp (original)
+++ lld/trunk/ELF/Target.cpp Mon May  9 13:12:15 2016
@@ -531,6 +531,10 @@ RelExpr X86_64TargetInfo::getRelExpr(uin
 }
 
 void X86_64TargetInfo::writeGotPltHeader(uint8_t *Buf) const {
+  // The first entry holds the value of _DYNAMIC. It is not clear why that is
+  // required, but it is documented in the psabi and the glibc dynamic linker
+  // seems to use it (not that this is relevant for linking ld.so, not any
+  // other program).
   write64le(Buf, Out<ELF64LE>::Dynamic->getVA());
 }
 

Modified: lld/trunk/ELF/Target.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Target.h?rev=268945&r1=268944&r2=268945&view=diff
==============================================================================
--- lld/trunk/ELF/Target.h (original)
+++ lld/trunk/ELF/Target.h Mon May  9 13:12:15 2016
@@ -78,7 +78,11 @@ public:
   uint32_t TlsOffsetRel;
   unsigned PltEntrySize = 8;
   unsigned PltZeroSize = 0;
+
+  // At least on x86_64 positions 1 and 2 are used by the first plt entry
+  // to support lazy loading.
   unsigned GotPltHeaderEntriesNum = 3;
+
   uint32_t ThunkSize = 0;
   bool UseLazyBinding = false;
 

Added: lld/trunk/test/ELF/got-plt-header.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/got-plt-header.s?rev=268945&view=auto
==============================================================================
--- lld/trunk/test/ELF/got-plt-header.s (added)
+++ lld/trunk/test/ELF/got-plt-header.s Mon May  9 13:12:15 2016
@@ -0,0 +1,30 @@
+// RUN: llvm-mc %s -o %t.o -filetype=obj -triple=x86_64-pc-linux
+// RUN: ld.lld %t.o -o %t.so -shared
+// RUN: llvm-readobj -s -section-data %t.so | FileCheck %s
+
+        call foo at plt
+
+// Check that the first .got.plt entry has the address of the dynamic table.
+
+// CHECK:      Type: SHT_DYNAMIC
+// CHECK-NEXT: Flags [
+// CHECK-NEXT:   SHF_ALLOC
+// CHECK-NEXT:   SHF_WRITE
+// CHECK-NEXT: ]
+// CHECK-NEXT: Address: 0x2000
+
+// 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: 0x3000
+// CHECK-NEXT: Offset: 0x3000
+// CHECK-NEXT: Size: 32
+// CHECK-NEXT: Link: 0
+// CHECK-NEXT: Info: 0
+// CHECK-NEXT: AddressAlignment: 8
+// CHECK-NEXT: EntrySize: 0
+// CHECK-NEXT: SectionData (
+// CHECK-NEXT:   0000: 00200000 00000000 00000000 00000000




More information about the llvm-commits mailing list