[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
This commit is contained in:
George Rimar 2016-11-29 09:43:51 +00:00
parent 91c1fc2994
commit 595a763f38
5 changed files with 28 additions and 0 deletions

View File

@ -114,6 +114,7 @@ struct Configuration {
bool NoUndefinedVersion;
bool Nostdlib;
bool OFormatBinary;
bool OMagic;
bool Pic;
bool Pie;
bool PrintGcSections;

View File

@ -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);

View File

@ -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>;

View File

@ -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;

View File

@ -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