[lld] r282560 - [ELF] Use MaxPageSize for aligning PT_LOAD

Petr Hosek via llvm-commits llvm-commits at lists.llvm.org
Tue Sep 27 17:09:20 PDT 2016


Author: phosek
Date: Tue Sep 27 19:09:20 2016
New Revision: 282560

URL: http://llvm.org/viewvc/llvm-project?rev=282560&view=rev
Log:
[ELF] Use MaxPageSize for aligning PT_LOAD

This matches the behavior of Binutils linkers. We also change the
default MaxPageSize on x86-64 to 0x1000 to preserver the current
behavior, which is the same as the behavior implemented by gold.

https://llvm.org/bugs/show_bug.cgi?id=30541

Differential Revision: https://reviews.llvm.org/D24987

Modified:
    lld/trunk/ELF/Driver.cpp
    lld/trunk/ELF/Target.cpp
    lld/trunk/ELF/Writer.cpp
    lld/trunk/test/ELF/linkerscript/data-segment-relro.s
    lld/trunk/test/ELF/linkerscript/locationcounter.s
    lld/trunk/test/ELF/linkerscript/outsections-addr.s
    lld/trunk/test/ELF/linkerscript/symbol-assignexpr.s

Modified: lld/trunk/ELF/Driver.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Driver.cpp?rev=282560&r1=282559&r2=282560&view=diff
==============================================================================
--- lld/trunk/ELF/Driver.cpp (original)
+++ lld/trunk/ELF/Driver.cpp Tue Sep 27 19:09:20 2016
@@ -651,7 +651,7 @@ template <class ELFT> void LinkerDriver:
     StringRef S = Arg->getValue();
     if (S.getAsInteger(0, Config->ImageBase))
       error(Arg->getSpelling() + ": number expected, but got " + S);
-    else if ((Config->ImageBase % Target->PageSize) != 0)
+    else if ((Config->ImageBase % Target->MaxPageSize) != 0)
       warning(Arg->getSpelling() + ": address isn't multiple of page size");
   } else {
     Config->ImageBase = Config->Pic ? 0 : Target->DefaultImageBase;

Modified: lld/trunk/ELF/Target.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Target.cpp?rev=282560&r1=282559&r2=282560&view=diff
==============================================================================
--- lld/trunk/ELF/Target.cpp (original)
+++ lld/trunk/ELF/Target.cpp Tue Sep 27 19:09:20 2016
@@ -546,7 +546,6 @@ void X86TargetInfo::relaxTlsLdToLe(uint8
 }
 
 template <class ELFT> X86_64TargetInfo<ELFT>::X86_64TargetInfo() {
-  MaxPageSize = 0x200000; // 2MiB
   CopyRel = R_X86_64_COPY;
   GotRel = R_X86_64_GLOB_DAT;
   PltRel = R_X86_64_JUMP_SLOT;
@@ -989,7 +988,7 @@ PPC64TargetInfo::PPC64TargetInfo() {
 
   // We need 64K pages (at least under glibc/Linux, the loader won't
   // set different permissions on a finer granularity than that).
-  PageSize = 65536;
+  MaxPageSize = 65536;
 
   // The PPC64 ELF ABI v1 spec, says:
   //
@@ -1855,7 +1854,7 @@ bool ARMTargetInfo::isTlsInitialExecRel(
 
 template <class ELFT> MipsTargetInfo<ELFT>::MipsTargetInfo() {
   GotPltHeaderEntriesNum = 2;
-  PageSize = 65536;
+  MaxPageSize = 65536;
   GotEntrySize = sizeof(typename ELFT::uint);
   GotPltEntrySize = sizeof(typename ELFT::uint);
   PltEntrySize = 16;

Modified: lld/trunk/ELF/Writer.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Writer.cpp?rev=282560&r1=282559&r2=282560&view=diff
==============================================================================
--- lld/trunk/ELF/Writer.cpp (original)
+++ lld/trunk/ELF/Writer.cpp Tue Sep 27 19:09:20 2016
@@ -1154,7 +1154,7 @@ template <class ELFT> void Writer<ELFT>:
   for (OutputSectionBase<ELFT> *Sec : OutputSections) {
     uintX_t Alignment = Sec->getAlignment();
     if (Sec->PageAlign)
-      Alignment = std::max<uintX_t>(Alignment, Target->PageSize);
+      Alignment = std::max<uintX_t>(Alignment, Target->MaxPageSize);
 
     auto I = Config->SectionStartMap.find(Sec->getName());
     if (I != Config->SectionStartMap.end())
@@ -1182,14 +1182,14 @@ template <class ELFT, class uintX_t>
 static uintX_t getFileAlignment(uintX_t Off, OutputSectionBase<ELFT> *Sec) {
   uintX_t Alignment = Sec->getAlignment();
   if (Sec->PageAlign)
-    Alignment = std::max<uintX_t>(Alignment, Target->PageSize);
+    Alignment = std::max<uintX_t>(Alignment, Target->MaxPageSize);
   Off = alignTo(Off, Alignment);
 
   // Relocatable output does not have program headers
   // and does not need any other offset adjusting.
   if (Config->Relocatable || !(Sec->getFlags() & SHF_ALLOC))
     return Off;
-  return alignTo(Off, Target->PageSize, Sec->getVA());
+  return alignTo(Off, Target->MaxPageSize, Sec->getVA());
 }
 
 template <class ELFT, class uintX_t>
@@ -1241,7 +1241,7 @@ template <class ELFT> void Writer<ELFT>:
       H.p_vaddr = First->getVA();
     }
     if (H.p_type == PT_LOAD)
-      H.p_align = Target->PageSize;
+      H.p_align = Target->MaxPageSize;
     else if (H.p_type == PT_GNU_RELRO)
       H.p_align = 1;
 

Modified: lld/trunk/test/ELF/linkerscript/data-segment-relro.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/linkerscript/data-segment-relro.s?rev=282560&r1=282559&r2=282560&view=diff
==============================================================================
--- lld/trunk/test/ELF/linkerscript/data-segment-relro.s (original)
+++ lld/trunk/test/ELF/linkerscript/data-segment-relro.s Tue Sep 27 19:09:20 2016
@@ -31,7 +31,7 @@
 # CHECK-NEXT:      SHF_ALLOC
 # CHECK-NEXT:      SHF_WRITE
 # CHECK-NEXT:    ]
-# CHECK-NEXT:    Address: 0x2000F0
+# CHECK-NEXT:    Address: 0x10F0
 # CHECK-NEXT:    Offset: 0x10F0
 # CHECK-NEXT:    Size:
 # CHECK-NEXT:    Link:
@@ -47,7 +47,7 @@
 # CHECK-NEXT:      SHF_ALLOC
 # CHECK-NEXT:      SHF_WRITE
 # CHECK-NEXT:    ]
-# CHECK-NEXT:    Address: 0x201000
+# CHECK-NEXT:    Address: 0x2000
 # CHECK-NEXT:    Offset: 0x2000
 # CHECK-NEXT:    Size:
 # CHECK-NEXT:    Link:

Modified: lld/trunk/test/ELF/linkerscript/locationcounter.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/linkerscript/locationcounter.s?rev=282560&r1=282559&r2=282560&view=diff
==============================================================================
--- lld/trunk/test/ELF/linkerscript/locationcounter.s (original)
+++ lld/trunk/test/ELF/linkerscript/locationcounter.s Tue Sep 27 19:09:20 2016
@@ -65,9 +65,9 @@
 # CHECK: .greateq          {{.*}} 0000000000021000
 # CHECK: .eq               {{.*}} 0000000000022000
 # CHECK: .neq              {{.*}} 0000000000023000
-# CHECK: .maxpagesize      {{.*}} 0000000004800000
+# CHECK: .maxpagesize      {{.*}} 0000000000024000
 # CHECK: .commonpagesize   {{.*}} 0000000000025000
-# CHECK: .datasegmentalign {{.*}} 0000000000200000
+# CHECK: .datasegmentalign {{.*}} 0000000000026000
 # CHECK: .plusassign       {{.*}} 0000000000028000
 # CHECK: .unary            {{.*}} 000000000002a000
 # CHECK: .shiftl           {{.*}} 0000000000030040

Modified: lld/trunk/test/ELF/linkerscript/outsections-addr.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/linkerscript/outsections-addr.s?rev=282560&r1=282559&r2=282560&view=diff
==============================================================================
--- lld/trunk/test/ELF/linkerscript/outsections-addr.s (original)
+++ lld/trunk/test/ELF/linkerscript/outsections-addr.s Tue Sep 27 19:09:20 2016
@@ -80,7 +80,7 @@
 #CHECK:    Flags [
 #CHECK:      SHF_ALLOC
 #CHECK:    ]
-#CHECK:    Address: 0x203008
+#CHECK:    Address: 0x4008
 #CHECK:    Offset: 0x2008
 #CHECK:    Size: 8
 #CHECK:    Link: 0

Modified: lld/trunk/test/ELF/linkerscript/symbol-assignexpr.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/linkerscript/symbol-assignexpr.s?rev=282560&r1=282559&r2=282560&view=diff
==============================================================================
--- lld/trunk/test/ELF/linkerscript/symbol-assignexpr.s (original)
+++ lld/trunk/test/ELF/linkerscript/symbol-assignexpr.s Tue Sep 27 19:09:20 2016
@@ -21,13 +21,13 @@
 # CHECK-NEXT: 0000000000000000 *UND* 00000000
 # CHECK-NEXT:                  .text 00000000 _start
 # CHECK-NEXT:                  .text 00000000 foo
-# CHECK-NEXT: 0000000000200000 *ABS* 00000000 symbol
-# CHECK-NEXT: 0000000000201234 *ABS* 00000000 symbol2
-# CHECK-NEXT: 0000000000201234 *ABS* 00000000 symbol3
-# CHECK-NEXT: 00000000001ffffc *ABS* 00000000 symbol4
-# CHECK-NEXT: 000000000020fffc *ABS* 00000000 symbol5
-# CHECK-NEXT: 000000000020fffc *ABS* 00000000 symbol6
-# CHECK-NEXT: 0000000000210000 *ABS* 00000000 symbol7
+# CHECK-NEXT: 0000000000001000 *ABS* 00000000 symbol
+# CHECK-NEXT: 0000000000002234 *ABS* 00000000 symbol2
+# CHECK-NEXT: 0000000000002234 *ABS* 00000000 symbol3
+# CHECK-NEXT: 0000000000000ffc *ABS* 00000000 symbol4
+# CHECK-NEXT: 0000000000010ffc *ABS* 00000000 symbol5
+# CHECK-NEXT: 0000000000010ffc *ABS* 00000000 symbol6
+# CHECK-NEXT: 0000000000011000 *ABS* 00000000 symbol7
 # CHECK-NEXT: ffffffffffff0004 *ABS* 00000000 symbol8
 # CHECK-NEXT: fffffffffffffffc *ABS* 00000000 symbol9
 # CHECK-NEXT: fedcba9876543210 *ABS* 00000000 symbol10




More information about the llvm-commits mailing list