<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Mon, May 9, 2016 at 11:12 AM, Rafael Espindola via llvm-commits <span dir="ltr"><<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex">Author: rafael<br>
Date: Mon May  9 13:12:15 2016<br>
New Revision: 268945<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=268945&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=268945&view=rev</a><br>
Log:<br>
Document and test the first few .got.plt entries.<br>
<br>
Added:<br>
    lld/trunk/test/ELF/got-plt-header.s<br>
Modified:<br>
    lld/trunk/ELF/Target.cpp<br>
    lld/trunk/ELF/Target.h<br>
<br>
Modified: lld/trunk/ELF/Target.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Target.cpp?rev=268945&r1=268944&r2=268945&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Target.cpp?rev=268945&r1=268944&r2=268945&view=diff</a><br>
==============================================================================<br>
--- lld/trunk/ELF/Target.cpp (original)<br>
+++ lld/trunk/ELF/Target.cpp Mon May  9 13:12:15 2016<br>
@@ -531,6 +531,10 @@ RelExpr X86_64TargetInfo::getRelExpr(uin<br>
 }<br>
<br>
 void X86_64TargetInfo::writeGotPltHeader(uint8_t *Buf) const {<br>
+  // The first entry holds the value of _DYNAMIC. It is not clear why that is<br>
+  // required, but it is documented in the psabi and the glibc dynamic linker<br>
+  // seems to use it (not that this is relevant for linking ld.so, not any<br>
+  // other program).<br></blockquote><div><br></div><div>Could you reword "not that this is relevant for linking ld.so, not any other program"? There's something awkward about the two "not"'s.</div><div><br></div><div>-- Sean Silva</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex">
   write64le(Buf, Out<ELF64LE>::Dynamic->getVA());<br>
 }<br>
<br>
<br>
Modified: lld/trunk/ELF/Target.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Target.h?rev=268945&r1=268944&r2=268945&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Target.h?rev=268945&r1=268944&r2=268945&view=diff</a><br>
==============================================================================<br>
--- lld/trunk/ELF/Target.h (original)<br>
+++ lld/trunk/ELF/Target.h Mon May  9 13:12:15 2016<br>
@@ -78,7 +78,11 @@ public:<br>
   uint32_t TlsOffsetRel;<br>
   unsigned PltEntrySize = 8;<br>
   unsigned PltZeroSize = 0;<br>
+<br>
+  // At least on x86_64 positions 1 and 2 are used by the first plt entry<br>
+  // to support lazy loading.<br>
   unsigned GotPltHeaderEntriesNum = 3;<br>
+<br>
   uint32_t ThunkSize = 0;<br>
   bool UseLazyBinding = false;<br>
<br>
<br>
Added: lld/trunk/test/ELF/got-plt-header.s<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/got-plt-header.s?rev=268945&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/got-plt-header.s?rev=268945&view=auto</a><br>
==============================================================================<br>
--- lld/trunk/test/ELF/got-plt-header.s (added)<br>
+++ lld/trunk/test/ELF/got-plt-header.s Mon May  9 13:12:15 2016<br>
@@ -0,0 +1,30 @@<br>
+// RUN: llvm-mc %s -o %t.o -filetype=obj -triple=x86_64-pc-linux<br>
+// RUN: ld.lld %t.o -o %t.so -shared<br>
+// RUN: llvm-readobj -s -section-data %t.so | FileCheck %s<br>
+<br>
+        call foo@plt<br>
+<br>
+// Check that the first .got.plt entry has the address of the dynamic table.<br>
+<br>
+// CHECK:      Type: SHT_DYNAMIC<br>
+// CHECK-NEXT: Flags [<br>
+// CHECK-NEXT:   SHF_ALLOC<br>
+// CHECK-NEXT:   SHF_WRITE<br>
+// CHECK-NEXT: ]<br>
+// CHECK-NEXT: Address: 0x2000<br>
+<br>
+// CHECK:      Name: .got.plt<br>
+// CHECK-NEXT: Type: SHT_PROGBITS<br>
+// CHECK-NEXT: Flags [<br>
+// CHECK-NEXT:   SHF_ALLOC<br>
+// CHECK-NEXT:   SHF_WRITE<br>
+// CHECK-NEXT: ]<br>
+// CHECK-NEXT: Address: 0x3000<br>
+// CHECK-NEXT: Offset: 0x3000<br>
+// CHECK-NEXT: Size: 32<br>
+// CHECK-NEXT: Link: 0<br>
+// CHECK-NEXT: Info: 0<br>
+// CHECK-NEXT: AddressAlignment: 8<br>
+// CHECK-NEXT: EntrySize: 0<br>
+// CHECK-NEXT: SectionData (<br>
+// CHECK-NEXT:   0000: 00200000 00000000 00000000 00000000<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br></div></div>