summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lld/ELF/Writer.cpp17
-rw-r--r--lld/test/ELF/linkerscript/merge-sections.s1
-rw-r--r--lld/test/ELF/linkerscript/no-space.s2
-rw-r--r--lld/test/ELF/linkerscript/non-alloc.s2
-rw-r--r--lld/test/ELF/linkerscript/sections-constraint.s2
-rw-r--r--lld/test/ELF/linkerscript/sections-keep.s22
-rw-r--r--lld/test/ELF/linkerscript/sections-sort.s10
-rw-r--r--lld/test/ELF/linkerscript/sort-non-script.s4
-rw-r--r--lld/test/ELF/linkerscript/va.s6
9 files changed, 36 insertions, 30 deletions
diff --git a/lld/ELF/Writer.cpp b/lld/ELF/Writer.cpp
index d926ca120cc..d2ee56e74a2 100644
--- a/lld/ELF/Writer.cpp
+++ b/lld/ELF/Writer.cpp
@@ -466,12 +466,17 @@ static bool compareSectionsNonScript(OutputSectionBase<ELFT> *A,
if (AIsWritable != BIsWritable)
return BIsWritable;
- // For a corresponding reason, put non exec sections first (the program
- // header PT_LOAD is not executable).
- bool AIsExec = AFlags & SHF_EXECINSTR;
- bool BIsExec = BFlags & SHF_EXECINSTR;
- if (AIsExec != BIsExec)
- return BIsExec;
+ if (!ScriptConfig->HasSections) {
+ // For a corresponding reason, put non exec sections first (the program
+ // header PT_LOAD is not executable).
+ // We only do that if we are not using linker scripts, since with linker
+ // scripts ro and rx sections are in the same PT_LOAD, so their relative
+ // order is not important.
+ bool AIsExec = AFlags & SHF_EXECINSTR;
+ bool BIsExec = BFlags & SHF_EXECINSTR;
+ if (AIsExec != BIsExec)
+ return BIsExec;
+ }
// If we got here we know that both A and B are in the same PT_LOAD.
diff --git a/lld/test/ELF/linkerscript/merge-sections.s b/lld/test/ELF/linkerscript/merge-sections.s
index 4d0658abbba..b98796400b8 100644
--- a/lld/test/ELF/linkerscript/merge-sections.s
+++ b/lld/test/ELF/linkerscript/merge-sections.s
@@ -58,6 +58,7 @@
# CHECK-NEXT: Type:
# CHECK-NEXT: Flags [
# CHECK-NEXT: SHF_ALLOC
+# CHECK-NEXT: SHF_EXECINSTR
# CHECK-NEXT: ]
# CHECK-NEXT: Address: 0x[[ADDR2:.*]]
# CHECK-NEXT: Offset: 0x[[ADDR2]]
diff --git a/lld/test/ELF/linkerscript/no-space.s b/lld/test/ELF/linkerscript/no-space.s
index e8b6be7e790..9291109f6f2 100644
--- a/lld/test/ELF/linkerscript/no-space.s
+++ b/lld/test/ELF/linkerscript/no-space.s
@@ -16,7 +16,7 @@
# CHECK: Section to Segment mapping:
# CHECK-NEXT: Segment Sections...
# CHECK-NEXT: 00
-# CHECK-NEXT: 01 foo .dynsym .hash .dynstr
+# CHECK-NEXT: 01 foo .text .dynsym .hash .dynstr
.section foo, "a"
.quad 0
diff --git a/lld/test/ELF/linkerscript/non-alloc.s b/lld/test/ELF/linkerscript/non-alloc.s
index 2ab07a61e20..2060129a802 100644
--- a/lld/test/ELF/linkerscript/non-alloc.s
+++ b/lld/test/ELF/linkerscript/non-alloc.s
@@ -17,7 +17,7 @@
# CHECK: Section to Segment mapping:
# CHECK-NEXT: Segment Sections...
# CHECK-NEXT: 00
-# CHECK-NEXT: 01 .dynsym .hash .dynstr .text
+# CHECK-NEXT: 01 .text .dynsym .hash .dynstr
# CHECK-NEXT: 02 .dynamic
nop
diff --git a/lld/test/ELF/linkerscript/sections-constraint.s b/lld/test/ELF/linkerscript/sections-constraint.s
index a24a3b58995..a270e1396e3 100644
--- a/lld/test/ELF/linkerscript/sections-constraint.s
+++ b/lld/test/ELF/linkerscript/sections-constraint.s
@@ -24,8 +24,8 @@
# NO1-NEXT: 0 00000000
# NO1: .writable 00000004
# NO1: .readable 00000004
-# NO1: .foo.2 00000004
# NO1: .foo.1 00000004
+# NO1: .foo.2 00000004
.global _start
_start:
diff --git a/lld/test/ELF/linkerscript/sections-keep.s b/lld/test/ELF/linkerscript/sections-keep.s
index c8d69b8a23e..c39723c7ace 100644
--- a/lld/test/ELF/linkerscript/sections-keep.s
+++ b/lld/test/ELF/linkerscript/sections-keep.s
@@ -42,11 +42,11 @@
# MIXED1-NEXT: Idx Name Size
# MIXED1-NEXT: 0 00000000
# MIXED1-NEXT: 1 .keep 00000004
-# MIXED1-NEXT: 2 .temp 00000004
-# MIXED1-NEXT: 3 .text 00000007
-# MIXED1-NEXT: 4 .symtab 00000060
-# MIXED1-NEXT: 5 .shstrtab 0000002d
-# MIXED1-NEXT: 6 .strtab 00000012
+# MIXED1-NEXT: 2 .text 00000007 00000000000000ec TEXT DATA
+# MIXED1-NEXT: 3 .temp 00000004 00000000000000f3 DATA
+# MIXED1-NEXT: 4 .symtab 00000060 0000000000000000
+# MIXED1-NEXT: 5 .shstrtab 0000002d 0000000000000000
+# MIXED1-NEXT: 6 .strtab 00000012 0000000000000000
## The same, but now section without KEEP is at first place.
## gold and bfd linkers disagree here. gold collects .keep while
@@ -60,12 +60,12 @@
# MIXED2: Sections:
# MIXED2-NEXT: Idx Name Size
# MIXED2-NEXT: 0 00000000
-# MIXED2-NEXT: 1 .nokeep 00000004
-# MIXED2-NEXT: 2 .temp 00000004
-# MIXED2-NEXT: 3 .text 00000007
-# MIXED2-NEXT: 4 .symtab 00000060
-# MIXED2-NEXT: 5 .shstrtab 0000002f
-# MIXED2-NEXT: 6 .strtab 00000012
+# MIXED2-NEXT: 1 .nokeep 00000004 00000000000000e8 DATA
+# MIXED2-NEXT: 2 .text 00000007 00000000000000ec TEXT DATA
+# MIXED2-NEXT: 3 .temp 00000004 00000000000000f3 DATA
+# MIXED2-NEXT: 4 .symtab 00000060 0000000000000000
+# MIXED2-NEXT: 5 .shstrtab 0000002f 0000000000000000
+# MIXED2-NEXT: 6 .strtab 00000012 0000000000000000
.global _start
_start:
diff --git a/lld/test/ELF/linkerscript/sections-sort.s b/lld/test/ELF/linkerscript/sections-sort.s
index c8c6fd838ba..08b077ecbba 100644
--- a/lld/test/ELF/linkerscript/sections-sort.s
+++ b/lld/test/ELF/linkerscript/sections-sort.s
@@ -18,11 +18,11 @@ nop
# CHECK: Id
# CHECK-NEXT: 0
-# CHECK-NEXT: 1 .dynsym
-# CHECK-NEXT: 2 .hash
-# CHECK-NEXT: 3 .dynstr
-# CHECK-NEXT: 4 .text
-# CHECK-NEXT: 5 foo
+# CHECK-NEXT: 1 .text
+# CHECK-NEXT: 2 foo
+# CHECK-NEXT: 3 .dynsym
+# CHECK-NEXT: 4 .hash
+# CHECK-NEXT: 5 .dynstr
# CHECK-NEXT: 6 .dynamic
# CHECK-NEXT: 7 .symtab
# CHECK-NEXT: 8 .shstrtab
diff --git a/lld/test/ELF/linkerscript/sort-non-script.s b/lld/test/ELF/linkerscript/sort-non-script.s
index ac990b9a658..75a2d450adc 100644
--- a/lld/test/ELF/linkerscript/sort-non-script.s
+++ b/lld/test/ELF/linkerscript/sort-non-script.s
@@ -5,10 +5,10 @@
# RUN: ld.lld -o %t1 --script %t.script %t -shared
# RUN: llvm-readobj -elf-output-style=GNU -s %t1 | FileCheck %s
-# CHECK: .dynsym {{.*}} A
+# CHECK: .text {{.*}} AX
+# CHECK-NEXT: .dynsym {{.*}} A
# CHECK-NEXT: .hash {{.*}} A
# CHECK-NEXT: .dynstr {{.*}} A
-# CHECK-NEXT: .text {{.*}} AX
# CHECK-NEXT: .dynamic {{.*}} WA
# CHECK-NEXT: foo {{.*}} WA
diff --git a/lld/test/ELF/linkerscript/va.s b/lld/test/ELF/linkerscript/va.s
index 2e04f15a4b1..8d25c833ec3 100644
--- a/lld/test/ELF/linkerscript/va.s
+++ b/lld/test/ELF/linkerscript/va.s
@@ -7,9 +7,9 @@
# CHECK: Sections:
# CHECK-NEXT: Idx Name Size Address Type
# CHECK-NEXT: 0 00000000 0000000000000000
-# CHECK-NEXT: 1 .foo 00000004 00000000000000e8 DATA
-# CHECK-NEXT: 2 .boo 00000004 00000000000000ec DATA
-# CHECK-NEXT: 3 .text 00000001 00000000000000f0 TEXT DATA
+# CHECK-NEXT: 1 .text 00000001 00000000000000e8 TEXT DATA
+# CHECK-NEXT: 2 .foo 00000004 00000000000000e9 DATA
+# CHECK-NEXT: 3 .boo 00000004 00000000000000ed DATA
.global _start
_start:
OpenPOWER on IntegriCloud