Index: ELF/LinkerScript.cpp =================================================================== --- ELF/LinkerScript.cpp +++ ELF/LinkerScript.cpp @@ -652,7 +652,16 @@ 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 + // 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); Index: test/ELF/linkerscript/phdrs.s =================================================================== --- test/ELF/linkerscript/phdrs.s +++ 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 { \ @@ -33,6 +44,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)