[PATCH] D26889: [ELF] - Implemented -no-rosegment.
Rafael Avila de Espindola via llvm-commits
llvm-commits at lists.llvm.org
Mon Nov 28 01:32:08 PST 2016
LGTM, but in a followup patch please change the if in
compareSectionsNonScript to use SingleRoRx instead of HasSections (and
add a test).
George Rimar via Phabricator <reviews at reviews.llvm.org> writes:
> grimar updated this revision to Diff 79377.
> grimar added a comment.
>
> - Addressed review comments.
>
>
> https://reviews.llvm.org/D26889
>
> Files:
> ELF/Config.h
> ELF/Driver.cpp
> ELF/Options.td
> ELF/Writer.cpp
> test/ELF/segments.s
>
> Index: test/ELF/segments.s
> ===================================================================
> --- test/ELF/segments.s
> +++ test/ELF/segments.s
> @@ -0,0 +1,88 @@
> +# REQUIRES: x86
> +# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t
> +# RUN: ld.lld %t -o %t1
> +# RUN: llvm-readobj --program-headers %t1 | FileCheck --check-prefix=ROSEGMENT %s
> +
> +# ROSEGMENT: ProgramHeader {
> +# ROSEGMENT: Type: PT_LOAD
> +# ROSEGMENT-NEXT: Offset: 0x0
> +# ROSEGMENT-NEXT: VirtualAddress:
> +# ROSEGMENT-NEXT: PhysicalAddress:
> +# ROSEGMENT-NEXT: FileSize:
> +# ROSEGMENT-NEXT: MemSize:
> +# ROSEGMENT-NEXT: Flags [
> +# ROSEGMENT-NEXT: PF_R
> +# ROSEGMENT-NEXT: ]
> +# ROSEGMENT-NEXT: Alignment: 4096
> +# ROSEGMENT-NEXT: }
> +# ROSEGMENT-NEXT: ProgramHeader {
> +# ROSEGMENT-NEXT: Type: PT_LOAD
> +# ROSEGMENT-NEXT: Offset: 0x1000
> +# ROSEGMENT-NEXT: VirtualAddress:
> +# ROSEGMENT-NEXT: PhysicalAddress:
> +# ROSEGMENT-NEXT: FileSize:
> +# ROSEGMENT-NEXT: MemSize:
> +# ROSEGMENT-NEXT: Flags [
> +# ROSEGMENT-NEXT: PF_R
> +# ROSEGMENT-NEXT: PF_X
> +# ROSEGMENT-NEXT: ]
> +# ROSEGMENT-NEXT: Alignment: 4096
> +# ROSEGMENT-NEXT: }
> +# ROSEGMENT-NEXT: ProgramHeader {
> +# ROSEGMENT-NEXT: Type: PT_LOAD
> +# ROSEGMENT-NEXT: Offset: 0x2000
> +# ROSEGMENT-NEXT: VirtualAddress:
> +# ROSEGMENT-NEXT: PhysicalAddress:
> +# ROSEGMENT-NEXT: FileSize: 1
> +# ROSEGMENT-NEXT: MemSize: 1
> +# ROSEGMENT-NEXT: Flags [
> +# ROSEGMENT-NEXT: PF_R
> +# ROSEGMENT-NEXT: PF_W
> +# ROSEGMENT-NEXT: ]
> +# ROSEGMENT-NEXT: Alignment: 4096
> +# ROSEGMENT-NEXT: }
> +
> +# RUN: ld.lld -no-rosegment %t -o %t2
> +# RUN: llvm-readobj --program-headers %t2 | FileCheck --check-prefix=NOROSEGMENT %s
> +
> +# NOROSEGMENT: ProgramHeader {
> +# NOROSEGMENT: Type: PT_LOAD
> +# NOROSEGMENT-NEXT: Offset: 0x0
> +# NOROSEGMENT-NEXT: VirtualAddress:
> +# NOROSEGMENT-NEXT: PhysicalAddress:
> +# NOROSEGMENT-NEXT: FileSize:
> +# NOROSEGMENT-NEXT: MemSize:
> +# NOROSEGMENT-NEXT: Flags [
> +# NOROSEGMENT-NEXT: PF_R
> +# NOROSEGMENT-NEXT: PF_X
> +# NOROSEGMENT-NEXT: ]
> +# NOROSEGMENT-NEXT: Alignment: 4096
> +# NOROSEGMENT-NEXT: }
> +# NOROSEGMENT-NEXT: ProgramHeader {
> +# NOROSEGMENT-NEXT: Type: PT_LOAD
> +# NOROSEGMENT-NEXT: Offset: 0x1000
> +# NOROSEGMENT-NEXT: VirtualAddress:
> +# NOROSEGMENT-NEXT: PhysicalAddress:
> +# NOROSEGMENT-NEXT: FileSize:
> +# NOROSEGMENT-NEXT: MemSize:
> +# NOROSEGMENT-NEXT: Flags [
> +# NOROSEGMENT-NEXT: PF_R
> +# NOROSEGMENT-NEXT: PF_W
> +# NOROSEGMENT-NEXT: ]
> +# NOROSEGMENT-NEXT: Alignment: 4096
> +# NOROSEGMENT-NEXT: }
> +# NOROSEGMENT-NEXT: ProgramHeader {
> +# NOROSEGMENT-NEXT: Type: PT_GNU_STACK
> +
> +.global _start
> +_start:
> + nop
> +
> +.section .ro,"a"
> +nop
> +
> +.section .rw,"aw"
> +nop
> +
> +.section .rx,"ax"
> +nop
> Index: ELF/Writer.cpp
> ===================================================================
> --- ELF/Writer.cpp
> +++ ELF/Writer.cpp
> @@ -1096,7 +1096,7 @@
> // cannot create a PT_LOAD there.
> template <class ELFT>
> static typename ELFT::uint computeFlags(typename ELFT::uint F) {
> - if (ScriptConfig->HasSections && !(F & PF_W))
> + if (Config->SingleRoRx && !(F & PF_W))
> return F | PF_X;
> return F;
> }
> Index: ELF/Options.td
> ===================================================================
> --- ELF/Options.td
> +++ ELF/Options.td
> @@ -147,6 +147,8 @@
>
> def nopie: F<"nopie">, HelpText<"Do not create a position independent executable">;
>
> +def no_rosegment: F<"no-rosegment">, HelpText<"Do not put read-only non-executable sections in their own segment">;
> +
> def no_undefined: F<"no-undefined">,
> HelpText<"Report unresolved symbols even if the linker is creating a shared library">;
>
> Index: ELF/Driver.cpp
> ===================================================================
> --- ELF/Driver.cpp
> +++ ELF/Driver.cpp
> @@ -696,6 +696,12 @@
> }
> }
>
> + // -no-rosegment is used to avoid placing read only non-executable sections in
> + // their own segment. We do the same if SECTIONS command is present in linker
> + // script. See comment for computeFlags().
> + Config->SingleRoRx =
> + Args.hasArg(OPT_no_rosegment) || ScriptConfig->HasSections;
> +
> if (Files.empty() && ErrorCount == 0)
> error("no input files");
> }
> Index: ELF/Config.h
> ===================================================================
> --- ELF/Config.h
> +++ ELF/Config.h
> @@ -120,6 +120,7 @@
> bool Rela;
> bool Relocatable;
> bool SaveTemps;
> + bool SingleRoRx;
> bool Shared;
> bool Static = false;
> bool SysvHash = true;
More information about the llvm-commits
mailing list