From 595a763f38ced2cb994903acdf36e8b76b99edf7 Mon Sep 17 00:00:00 2001 From: George Rimar Date: Tue, 29 Nov 2016 09:43:51 +0000 Subject: [PATCH] [ELF] - Implemented -N (-omagic) command line option. -N (-omagic) Set the text and data sections to be readable and writable. Also, do not page-align the data segment. Differential revision: https://reviews.llvm.org/D26888 llvm-svn: 288123 --- lld/ELF/Config.h | 1 + lld/ELF/Driver.cpp | 1 + lld/ELF/Options.td | 4 ++++ lld/ELF/Writer.cpp | 2 ++ lld/test/ELF/segments.s | 20 ++++++++++++++++++++ 5 files changed, 28 insertions(+) diff --git a/lld/ELF/Config.h b/lld/ELF/Config.h index e7c7312..31ecd26 100644 --- a/lld/ELF/Config.h +++ b/lld/ELF/Config.h @@ -114,6 +114,7 @@ struct Configuration { bool NoUndefinedVersion; bool Nostdlib; bool OFormatBinary; + bool OMagic; bool Pic; bool Pie; bool PrintGcSections; diff --git a/lld/ELF/Driver.cpp b/lld/ELF/Driver.cpp index ab3b77f..9356168 100644 --- a/lld/ELF/Driver.cpp +++ b/lld/ELF/Driver.cpp @@ -526,6 +526,7 @@ void LinkerDriver::readConfigs(opt::InputArgList &Args) { 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); diff --git a/lld/ELF/Options.td b/lld/ELF/Options.td index c7e7e78..4530796 100644 --- a/lld/ELF/Options.td +++ b/lld/ELF/Options.td @@ -161,6 +161,9 @@ def o: JoinedOrSeparate<["-"], "o">, MetaVarName<"">, 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_format_b: S<"b">, Alias; 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; diff --git a/lld/ELF/Writer.cpp b/lld/ELF/Writer.cpp index b74c251..2fd2dc3 100644 --- a/lld/ELF/Writer.cpp +++ b/lld/ELF/Writer.cpp @@ -1096,6 +1096,8 @@ template static bool needsPtLoad(OutputSectionBase *Sec) { // 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; diff --git a/lld/test/ELF/segments.s b/lld/test/ELF/segments.s index b3b62e6..9307ba3 100644 --- a/lld/test/ELF/segments.s +++ b/lld/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 -- 2.7.4