diff options
author | Michael J. Spencer <bigcheesegs@gmail.com> | 2016-08-17 02:10:51 +0000 |
---|---|---|
committer | Michael J. Spencer <bigcheesegs@gmail.com> | 2016-08-17 02:10:51 +0000 |
commit | e2cc07bc0b232a25a0f07456abb7d18090049790 (patch) | |
tree | 7ac62f058c05dd8b462d656780e7ad0b5c982a2d | |
parent | 53d55f45a1fde4683e2ebc0fc83c39c2a36a99d7 (diff) | |
download | bcm5719-llvm-e2cc07bc0b232a25a0f07456abb7d18090049790.tar.gz bcm5719-llvm-e2cc07bc0b232a25a0f07456abb7d18090049790.zip |
[ELF] Set MAXPAGESIZE to 2MiB on x86-64 to match bfd and gold.
The FreeBSD kernel relies on this behavior to not overwrite the boot loader.
llvm-svn: 278889
-rw-r--r-- | lld/ELF/LinkerScript.cpp | 4 | ||||
-rw-r--r-- | lld/ELF/Target.cpp | 1 | ||||
-rw-r--r-- | lld/ELF/Target.h | 1 | ||||
-rw-r--r-- | lld/test/ELF/linkerscript-outsections-addr.s | 2 | ||||
-rw-r--r-- | lld/test/ELF/linkerscript/linkerscript-data-segment-relro.s | 4 | ||||
-rw-r--r-- | lld/test/ELF/linkerscript/linkerscript-locationcounter.s | 4 | ||||
-rw-r--r-- | lld/test/ELF/linkerscript/linkerscript-symbol-assignexpr.s | 6 |
7 files changed, 13 insertions, 9 deletions
diff --git a/lld/ELF/LinkerScript.cpp b/lld/ELF/LinkerScript.cpp index 7195d8f6c41..df400a4d0d2 100644 --- a/lld/ELF/LinkerScript.cpp +++ b/lld/ELF/LinkerScript.cpp @@ -1138,8 +1138,10 @@ Expr ScriptParser::readExpr1(Expr Lhs, int MinPrec) { } uint64_t static getConstant(StringRef S) { - if (S == "COMMONPAGESIZE" || S == "MAXPAGESIZE") + if (S == "COMMONPAGESIZE") return Target->PageSize; + if (S == "MAXPAGESIZE") + return Target->MaxPageSize; error("unknown constant: " + S); return 0; } diff --git a/lld/ELF/Target.cpp b/lld/ELF/Target.cpp index ab71de35716..88461377b4b 100644 --- a/lld/ELF/Target.cpp +++ b/lld/ELF/Target.cpp @@ -545,6 +545,7 @@ void X86TargetInfo::relaxTlsLdToLe(uint8_t *Loc, uint32_t Type, } 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; diff --git a/lld/ELF/Target.h b/lld/ELF/Target.h index 67bf3a27ff7..de5a101be06 100644 --- a/lld/ELF/Target.h +++ b/lld/ELF/Target.h @@ -62,6 +62,7 @@ public: unsigned TlsGdRelaxSkip = 1; unsigned PageSize = 4096; + unsigned MaxPageSize = 4096; // On freebsd x86_64 the first page cannot be mmaped. // On linux that is controled by vm.mmap_min_addr. At least on some x86_64 diff --git a/lld/test/ELF/linkerscript-outsections-addr.s b/lld/test/ELF/linkerscript-outsections-addr.s index 100eba7542e..b305724979d 100644 --- a/lld/test/ELF/linkerscript-outsections-addr.s +++ b/lld/test/ELF/linkerscript-outsections-addr.s @@ -80,7 +80,7 @@ #CHECK: Flags [ #CHECK: SHF_ALLOC #CHECK: ] -#CHECK: Address: 0x4008 +#CHECK: Address: 0x203008 #CHECK: Offset: 0x2008 #CHECK: Size: 8 #CHECK: Link: 0 diff --git a/lld/test/ELF/linkerscript/linkerscript-data-segment-relro.s b/lld/test/ELF/linkerscript/linkerscript-data-segment-relro.s index 559113e6706..94734110ca0 100644 --- a/lld/test/ELF/linkerscript/linkerscript-data-segment-relro.s +++ b/lld/test/ELF/linkerscript/linkerscript-data-segment-relro.s @@ -31,7 +31,7 @@ # CHECK-NEXT: SHF_ALLOC # CHECK-NEXT: SHF_WRITE # CHECK-NEXT: ] -# CHECK-NEXT: Address: 0x10F0 +# CHECK-NEXT: Address: 0x2000F0 # 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: 0x2000 +# CHECK-NEXT: Address: 0x201000 # CHECK-NEXT: Offset: 0x2000 # CHECK-NEXT: Size: # CHECK-NEXT: Link: diff --git a/lld/test/ELF/linkerscript/linkerscript-locationcounter.s b/lld/test/ELF/linkerscript/linkerscript-locationcounter.s index f70e78d8729..94af0ce3840 100644 --- a/lld/test/ELF/linkerscript/linkerscript-locationcounter.s +++ b/lld/test/ELF/linkerscript/linkerscript-locationcounter.s @@ -261,7 +261,7 @@ # CHECK-NEXT: Flags [ # CHECK-NEXT: SHF_ALLOC # CHECK-NEXT: ] -# CHECK-NEXT: Address: 0x24000 +# CHECK-NEXT: Address: 0x4800000 # CHECK-NEXT: Offset: # CHECK-NEXT: Size: # CHECK-NEXT: Link: @@ -291,7 +291,7 @@ # CHECK-NEXT: Flags [ # CHECK-NEXT: SHF_ALLOC # CHECK-NEXT: ] -# CHECK-NEXT: Address: 0x26000 +# CHECK-NEXT: Address: 0x200000 # CHECK-NEXT: Offset: # CHECK-NEXT: Size: # CHECK-NEXT: Link: diff --git a/lld/test/ELF/linkerscript/linkerscript-symbol-assignexpr.s b/lld/test/ELF/linkerscript/linkerscript-symbol-assignexpr.s index 353800b6de6..80c4e89424e 100644 --- a/lld/test/ELF/linkerscript/linkerscript-symbol-assignexpr.s +++ b/lld/test/ELF/linkerscript/linkerscript-symbol-assignexpr.s @@ -13,9 +13,9 @@ # CHECK-NEXT: 0000000000000000 *UND* 00000000 # CHECK-NEXT: 0000000000000120 .text 00000000 _start # CHECK-NEXT: 0000000000000121 .text 00000000 foo -# CHECK-NEXT: 0000000000001000 *ABS* 00000000 symbol -# CHECK-NEXT: 0000000000002234 *ABS* 00000000 symbol2 -# CHECK-NEXT: 0000000000002234 *ABS* 00000000 symbol3 +# CHECK-NEXT: 0000000000200000 *ABS* 00000000 symbol +# CHECK-NEXT: 0000000000201234 *ABS* 00000000 symbol2 +# CHECK-NEXT: 0000000000201234 *ABS* 00000000 symbol3 # RUN: echo "SECTIONS { \ # RUN: symbol2 = symbol; \ |