summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lld/ELF/Config.h1
-rw-r--r--lld/ELF/Driver.cpp1
-rw-r--r--lld/ELF/Options.td4
-rw-r--r--lld/ELF/Writer.cpp2
-rw-r--r--lld/test/ELF/segments.s20
5 files changed, 28 insertions, 0 deletions
diff --git a/lld/ELF/Config.h b/lld/ELF/Config.h
index e7c731240b6..31ecd264803 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 ab3b77fc2bf..9356168b180 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 c7e7e7838f4..4530796e7a5 100644
--- a/lld/ELF/Options.td
+++ b/lld/ELF/Options.td
@@ -161,6 +161,9 @@ def o: JoinedOrSeparate<["-"], "o">, MetaVarName<"<path>">,
def oformat: Separate<["--"], "oformat">, MetaVarName<"<format>">,
HelpText<"Specify the binary format for the output object file">;
+def omagic: F<"omagic">, MetaVarName<"<magic>">,
+ 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<format>;
def alias_hash_style_hash_style: J<"hash-style=">, Alias<hash_style>;
def alias_init_init: J<"init=">, Alias<init>;
def alias_l__library: J<"library=">, Alias<l>;
+def alias_omagic: Flag<["-"], "N">, Alias<omagic>;
def alias_o_output: Joined<["--"], "output=">, Alias<o>;
def alias_o_output2 : Separate<["--"], "output">, Alias<o>;
def alias_pie_pic_executable: F<"pic-executable">, Alias<pie>;
diff --git a/lld/ELF/Writer.cpp b/lld/ELF/Writer.cpp
index b74c2511b83..2fd2dc3e282 100644
--- a/lld/ELF/Writer.cpp
+++ b/lld/ELF/Writer.cpp
@@ -1096,6 +1096,8 @@ template <class ELFT> static bool needsPtLoad(OutputSectionBase *Sec) {
// cannot create a PT_LOAD there.
template <class ELFT>
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 b3b62e68450..9307ba39fe4 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
OpenPOWER on IntegriCloud