Index: lld/trunk/ELF/Config.h =================================================================== --- lld/trunk/ELF/Config.h +++ lld/trunk/ELF/Config.h @@ -114,6 +114,7 @@ bool NoUndefinedVersion; bool Nostdlib; bool OFormatBinary; + bool OMagic; bool Pic; bool Pie; bool PrintGcSections; Index: lld/trunk/ELF/Driver.cpp =================================================================== --- lld/trunk/ELF/Driver.cpp +++ lld/trunk/ELF/Driver.cpp @@ -526,6 +526,7 @@ Config->NoGnuUnique = Args.hasArg(OPT_no_gnu_unique); Config->NoUndefinedVersion = Args.hasArg(OPT_no_undefined_version); Config->Nostdlib = Args.hasArg(OPT_nostdlib); + Config->OMagic = Args.hasArg(OPT_omagic); Config->Pie = getArg(Args, OPT_pie, OPT_nopie, false); Config->PrintGcSections = Args.hasArg(OPT_print_gc_sections); Config->Relocatable = Args.hasArg(OPT_relocatable); Index: lld/trunk/ELF/Options.td =================================================================== --- lld/trunk/ELF/Options.td +++ lld/trunk/ELF/Options.td @@ -161,6 +161,9 @@ def oformat: Separate<["--"], "oformat">, MetaVarName<"">, HelpText<"Specify the binary format for the output object file">; +def omagic: F<"omagic">, MetaVarName<"">, + HelpText<"Set the text and data sections to be readable and writable">; + def pie: F<"pie">, HelpText<"Create a position independent executable">; def print_gc_sections: F<"print-gc-sections">, @@ -261,6 +264,7 @@ def alias_hash_style_hash_style: J<"hash-style=">, Alias; def alias_init_init: J<"init=">, Alias; def alias_l__library: J<"library=">, Alias; +def alias_omagic: Flag<["-"], "N">, Alias; def alias_o_output: Joined<["--"], "output=">, Alias; def alias_o_output2 : Separate<["--"], "output">, Alias; def alias_pie_pic_executable: F<"pic-executable">, Alias; Index: lld/trunk/ELF/Writer.cpp =================================================================== --- lld/trunk/ELF/Writer.cpp +++ lld/trunk/ELF/Writer.cpp @@ -1096,6 +1096,8 @@ // cannot create a PT_LOAD there. template static typename ELFT::uint computeFlags(typename ELFT::uint F) { + if (Config->OMagic) + return PF_R | PF_W | PF_X; if (Config->SingleRoRx && !(F & PF_W)) return F | PF_X; return F; Index: lld/trunk/test/ELF/segments.s =================================================================== --- lld/trunk/test/ELF/segments.s +++ lld/trunk/test/ELF/segments.s @@ -74,6 +74,26 @@ # NOROSEGMENT-NEXT: ProgramHeader { # NOROSEGMENT-NEXT: Type: PT_GNU_STACK +# RUN: ld.lld -N %t -o %t3 +# RUN: llvm-readobj --program-headers %t3 | FileCheck --check-prefix=OMAGIC %s + +# OMAGIC: ProgramHeader { +# OMAGIC: Type: PT_LOAD +# OMAGIC-NEXT: Offset: 0x0 +# OMAGIC-NEXT: VirtualAddress: +# OMAGIC-NEXT: PhysicalAddress: +# OMAGIC-NEXT: FileSize: +# OMAGIC-NEXT: MemSize: +# OMAGIC-NEXT: Flags [ +# OMAGIC-NEXT: PF_R +# OMAGIC-NEXT: PF_W +# OMAGIC-NEXT: PF_X +# OMAGIC-NEXT: ] +# OMAGIC-NEXT: Alignment: 4096 +# OMAGIC-NEXT: } +# OMAGIC-NEXT: ProgramHeader { +# OMAGIC-NEXT: Type: PT_GNU_STACK + .global _start _start: nop