Index: lld/trunk/ELF/LinkerScript.cpp =================================================================== --- lld/trunk/ELF/LinkerScript.cpp +++ lld/trunk/ELF/LinkerScript.cpp @@ -1720,6 +1720,7 @@ .Case("PT_GNU_EH_FRAME", PT_GNU_EH_FRAME) .Case("PT_GNU_STACK", PT_GNU_STACK) .Case("PT_GNU_RELRO", PT_GNU_RELRO) + .Case("PT_OPENBSD_RANDOMIZE", PT_OPENBSD_RANDOMIZE) .Case("PT_OPENBSD_WXNEEDED", PT_OPENBSD_WXNEEDED) .Default(-1); Index: lld/trunk/ELF/Writer.cpp =================================================================== --- lld/trunk/ELF/Writer.cpp +++ lld/trunk/ELF/Writer.cpp @@ -1097,6 +1097,14 @@ Hdr.add(Out::EhFrameHdr); } + // PT_OPENBSD_RANDOMIZE specifies the location and size of a part of the + // memory image of the program that must be filled with random data before any + // code in the object is executed. + if (OutputSectionBase *Sec = findSection(".openbsd.randomdata")) { + Phdr &Hdr = *AddHdr(PT_OPENBSD_RANDOMIZE, Sec->getPhdrFlags()); + Hdr.add(Sec); + } + // PT_ARM_EXIDX is the ARM EHABI equivalent of PT_GNU_EH_FRAME if (ARMExidx.First) Ret.push_back(std::move(ARMExidx)); Index: lld/trunk/test/ELF/linkerscript/openbsd-randomize.s =================================================================== --- lld/trunk/test/ELF/linkerscript/openbsd-randomize.s +++ lld/trunk/test/ELF/linkerscript/openbsd-randomize.s @@ -0,0 +1,22 @@ +# RUN: llvm-mc -filetype=obj -triple=i686-unknown-linux %s -o %t.o +# RUN: echo "PHDRS { text PT_LOAD FILEHDR PHDRS; rand PT_OPENBSD_RANDOMIZE; } \ +# RUN: SECTIONS { . = SIZEOF_HEADERS; \ +# RUN: .openbsd.randomdata : { *(.openbsd.randomdata) } : rand }" > %t.script +# RUN: ld.lld --script %t.script %t.o -o %t +# RUN: llvm-readobj --program-headers -s %t | FileCheck %s + +# CHECK: ProgramHeader { +# CHECK: Type: (0x65A3DBE6) +# CHECK-NEXT: Offset: 0x94 +# CHECK-NEXT: VirtualAddress: 0x94 +# CHECK-NEXT: PhysicalAddress: 0x94 +# CHECK-NEXT: FileSize: 8 +# CHECK-NEXT: MemSize: 8 +# CHECK-NEXT: Flags [ (0x4) +# CHECK-NEXT: PF_R (0x4) +# CHECK-NEXT: ] +# CHECK-NEXT: Alignment: 1 +# CHECK-NEXT: } + +.section .openbsd.randomdata, "a" +.quad 0 Index: lld/trunk/test/ELF/openbsd-randomize.s =================================================================== --- lld/trunk/test/ELF/openbsd-randomize.s +++ lld/trunk/test/ELF/openbsd-randomize.s @@ -0,0 +1,20 @@ +# REQUIRES: x86 +# RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t +# RUN: ld.lld %t -o %t.out +# RUN: llvm-readobj --program-headers %t.out | FileCheck %s + +# CHECK: ProgramHeader { +# CHECK: Type: (0x65A3DBE6) +# CHECK-NEXT: Offset: 0x158 +# CHECK-NEXT: VirtualAddress: 0x10158 +# CHECK-NEXT: PhysicalAddress: 0x10158 +# CHECK-NEXT: FileSize: 8 +# CHECK-NEXT: MemSize: 8 +# CHECK-NEXT: Flags [ (0x4) +# CHECK-NEXT: PF_R (0x4) +# CHECK-NEXT: ] +# CHECK-NEXT: Alignment: 1 +# CHECK-NEXT: } + +.section .openbsd.randomdata, "a" +.quad 0