diff options
-rw-r--r-- | lld/ELF/Writer.cpp | 17 | ||||
-rw-r--r-- | lld/test/ELF/linkerscript/merge-sections.s | 1 | ||||
-rw-r--r-- | lld/test/ELF/linkerscript/no-space.s | 2 | ||||
-rw-r--r-- | lld/test/ELF/linkerscript/non-alloc.s | 2 | ||||
-rw-r--r-- | lld/test/ELF/linkerscript/sections-constraint.s | 2 | ||||
-rw-r--r-- | lld/test/ELF/linkerscript/sections-keep.s | 22 | ||||
-rw-r--r-- | lld/test/ELF/linkerscript/sections-sort.s | 10 | ||||
-rw-r--r-- | lld/test/ELF/linkerscript/sort-non-script.s | 4 | ||||
-rw-r--r-- | lld/test/ELF/linkerscript/va.s | 6 |
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: |