From: Eugene Leviant Date: Thu, 20 Oct 2016 09:39:09 +0000 (+0000) Subject: Don't include PHDRs if linker script doesn't want them X-Git-Tag: llvmorg-4.0.0-rc1~6707 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=db35fdf70f08d6f644ef2679b8e79af59e710f16;p=platform%2Fupstream%2Fllvm.git Don't include PHDRs if linker script doesn't want them This script below shouldn't include file and program headers to PT_LOAD segment, because it doesn't have PHDRS and FILEHDR attributes: PHDRS { all PT_LOAD; } SECTIONS { /* list of sections here */ } Differential revision: https://reviews.llvm.org/D25774 llvm-svn: 284709 --- diff --git a/lld/ELF/LinkerScript.cpp b/lld/ELF/LinkerScript.cpp index b1462e0..ba8bb4c 100644 --- a/lld/ELF/LinkerScript.cpp +++ b/lld/ELF/LinkerScript.cpp @@ -652,7 +652,16 @@ void LinkerScript::assignAddresses(std::vector> &Phdrs) { std::find_if(Phdrs.begin(), Phdrs.end(), [](const PhdrEntry &E) { return E.H.p_type == PT_LOAD; }); + if (HeaderSize <= MinVA && FirstPTLoad != Phdrs.end()) { + // If linker script specifies program headers and first PT_LOAD doesn't + // have both PHDRS and FILEHDR attributes then do nothing + if (!Opt.PhdrsCommands.empty()) { + size_t SegNum = std::distance(Phdrs.begin(), FirstPTLoad); + if (!Opt.PhdrsCommands[SegNum].HasPhdrs || + !Opt.PhdrsCommands[SegNum].HasFilehdr) + return; + } // ELF and Program headers need to be right before the first section in // memory. Set their addresses accordingly. MinVA = alignDown(MinVA - HeaderSize, Target->PageSize); diff --git a/lld/test/ELF/linkerscript/phdrs.s b/lld/test/ELF/linkerscript/phdrs.s index 67c1e35..87feea4 100644 --- a/lld/test/ELF/linkerscript/phdrs.s +++ b/lld/test/ELF/linkerscript/phdrs.s @@ -9,6 +9,17 @@ # RUN: ld.lld -o %t1 --script %t.script %t # RUN: llvm-readobj -program-headers %t1 | FileCheck %s +## Check that program headers are not written, unless we explicitly tell +## lld to do this. +# RUN: echo "PHDRS {all PT_LOAD;} \ +# RUN: SECTIONS { \ +# RUN: . = 0x10000200; \ +# RUN: /DISCARD/ : {*(.text*)} \ +# RUN: .foo : {*(.foo.*)} :all \ +# RUN: }" > %t.script +# RUN: ld.lld -o %t1 --script %t.script %t +# RUN: llvm-readobj -program-headers %t1 | FileCheck --check-prefix=NOPHDR %s + ## Check the AT(expr) # RUN: echo "PHDRS {all PT_LOAD FILEHDR PHDRS AT(0x500 + 0x500) ;} \ # RUN: SECTIONS { \ @@ -42,6 +53,22 @@ # CHECK-NEXT: PF_X (0x1) # CHECK-NEXT: ] +# NOPHDR: ProgramHeaders [ +# NOPHDR-NEXT: ProgramHeader { +# NOPHDR-NEXT: Type: PT_LOAD (0x1) +# NOPHDR-NEXT: Offset: 0x200 +# NOPHDR-NEXT: VirtualAddress: 0x10000200 +# NOPHDR-NEXT: PhysicalAddress: 0x10000200 +# NOPHDR-NEXT: FileSize: 8 +# NOPHDR-NEXT: MemSize: 8 +# NOPHDR-NEXT: Flags [ (0x6) +# NOPHDR-NEXT: PF_R (0x4) +# NOPHDR-NEXT: PF_W (0x2) +# NOPHDR-NEXT: ] +# NOPHDR-NEXT: Alignment: 4096 +# NOPHDR-NEXT: } +# NOPHDR-NEXT: ] + # AT: ProgramHeaders [ # AT-NEXT: ProgramHeader { # AT-NEXT: Type: PT_LOAD (0x1)