diff options
-rw-r--r-- | lld/ELF/Writer.cpp | 4 | ||||
-rw-r--r-- | lld/test/ELF/arm-exidx-relocatable.s | 51 | ||||
-rw-r--r-- | lld/test/ELF/arm-use-r-output.s | 12 | ||||
-rw-r--r-- | lld/test/ELF/relocatable-sections.s | 4 | ||||
-rw-r--r-- | lld/test/ELF/relocatable.s | 2 |
5 files changed, 47 insertions, 26 deletions
diff --git a/lld/ELF/Writer.cpp b/lld/ELF/Writer.cpp index de9a2f9fe7d..7622484a3a3 100644 --- a/lld/ELF/Writer.cpp +++ b/lld/ELF/Writer.cpp @@ -778,6 +778,10 @@ static bool canSharePtLoad(const OutputSectionBase &S1, } template <class ELFT> void Writer<ELFT>::sortSections() { + // Don't sort if using -r. It is not necessary and we want to preserve the + // relative order for SHF_LINK_ORDER sections. + if (Config->Relocatable) + return; if (!ScriptConfig->HasSections) { std::stable_sort(OutputSections.begin(), OutputSections.end(), compareSectionsNonScript<ELFT>); diff --git a/lld/test/ELF/arm-exidx-relocatable.s b/lld/test/ELF/arm-exidx-relocatable.s index 231a75676ff..1b6ee3f23a4 100644 --- a/lld/test/ELF/arm-exidx-relocatable.s +++ b/lld/test/ELF/arm-exidx-relocatable.s @@ -42,6 +42,9 @@ f3: .cantunwind .fnend +// CHECK: Index: 1 +// CHECK-NEXT: Name: .text + // CHECK: Name: .ARM.exidx // CHECK-NEXT: Type: SHT_ARM_EXIDX (0x70000001) // CHECK-NEXT: Flags [ (0x82) @@ -51,7 +54,11 @@ f3: // CHECK-NEXT: Address // CHECK-NEXT: Offset: // CHECK-NEXT: Size: 24 -// CHECK-NEXT: Link: 7 +// CHECK-NEXT: Link: 1 + + +// CHECK: Index: 4 +// CHECK-NEXT: Name: .text.f1 // CHECK: Name: .ARM.exidx.text.f1 // CHECK-NEXT: Type: SHT_ARM_EXIDX (0x70000001) @@ -62,7 +69,11 @@ f3: // CHECK-NEXT: Address // CHECK-NEXT: Offset: // CHECK-NEXT: Size: 8 -// CHECK-NEXT: Link: 8 +// CHECK-NEXT: Link: 4 + + +// CHECK: Index: 7 +// CHECK-NEXT: Name: .text.f2 // CHECK: Name: .ARM.exidx.text.f2 // CHECK-NEXT: Type: SHT_ARM_EXIDX (0x70000001) @@ -73,7 +84,11 @@ f3: // CHECK-NEXT: Address // CHECK-NEXT: Offset: // CHECK-NEXT: Size: 16 -// CHECK-NEXT: Link: 9 +// CHECK-NEXT: Link: 7 + + +// CHECK: Index: 10 +// CHECK-NEXT: Name: .func1 // CHECK: Name: .ARM.exidx.func1 // CHECK-NEXT: Type: SHT_ARM_EXIDX (0x70000001) @@ -86,6 +101,10 @@ f3: // CHECK-NEXT: Size: 8 // CHECK-NEXT: Link: 10 + +// CHECK: Index: 13 +// CHECK-NEXT: Name: .func2 + // CHECK: Name: .ARM.exidx.func2 // CHECK-NEXT: Type: SHT_ARM_EXIDX (0x70000001) // CHECK-NEXT: Flags [ (0x82) @@ -95,7 +114,11 @@ f3: // CHECK-NEXT: Address // CHECK-NEXT: Offset: // CHECK-NEXT: Size: 8 -// CHECK-NEXT: Link: 11 +// CHECK-NEXT: Link: 13 + + +// CHECK: Index: 16 +// CHECK-NEXT: Name: .func3 // CHECK: Name: .ARM.exidx.func3 // CHECK-NEXT: Type: SHT_ARM_EXIDX (0x70000001) @@ -106,22 +129,4 @@ f3: // CHECK-NEXT: Address // CHECK-NEXT: Offset: // CHECK-NEXT: Size: 8 -// CHECK-NEXT: Link: 12 - -// CHECK: Index: 7 -// CHECK-NEXT: Name: .text - -// CHECK: Index: 8 -// CHECK-NEXT: Name: .text.f1 - -// CHECK: Index: 9 -// CHECK-NEXT: Name: .text.f2 - -// CHECK: Index: 10 -// CHECK-NEXT: Name: .func1 - -// CHECK: Index: 11 -// CHECK-NEXT: Name: .func2 - -// CHECK: Index: 12 -// CHECK-NEXT: Name: .func3 +// CHECK-NEXT: Link: 16 diff --git a/lld/test/ELF/arm-use-r-output.s b/lld/test/ELF/arm-use-r-output.s new file mode 100644 index 00000000000..8e5f2839f98 --- /dev/null +++ b/lld/test/ELF/arm-use-r-output.s @@ -0,0 +1,12 @@ +// RUN: llvm-mc -filetype=obj -triple=armv7a-none-linux-gnueabi %s -o %t.o +// RUN: ld.lld -r %t.o -o %t2.o +// RUN: ld.lld -shared %t2.o -o %t.so + +// We used to crash using the output of -r because of the relative order of +// SHF_LINK_ORDER sections. + +// That can be fixed by changing -r or making the regular link more flexible, +// so this is an end to end test. + + .fnstart + .fnend diff --git a/lld/test/ELF/relocatable-sections.s b/lld/test/ELF/relocatable-sections.s index 15731ce4921..d6a922fba48 100644 --- a/lld/test/ELF/relocatable-sections.s +++ b/lld/test/ELF/relocatable-sections.s @@ -3,10 +3,10 @@ # RUN: llvm-objdump -section-headers %t | FileCheck %s # CHECK: .text -# CHECK-NEXT: .text._init -# CHECK-NEXT: .text._fini # CHECK-NEXT: .rela.text +# CHECK: .text._init # CHECK-NEXT: .rela.text._init +# CHECK: .text._fini # CHECK-NEXT: .rela.text._fini .globl _start diff --git a/lld/test/ELF/relocatable.s b/lld/test/ELF/relocatable.s index 73cf4cccd83..cd031ad6d30 100644 --- a/lld/test/ELF/relocatable.s +++ b/lld/test/ELF/relocatable.s @@ -42,7 +42,7 @@ # CHECK-NEXT: } # CHECK: Relocations [ -# CHECK-NEXT: Section (3) .rela.text { +# CHECK-NEXT: Section ({{.*}}) .rela.text { # CHECK-NEXT: 0x3 R_X86_64_32S x 0x0 # CHECK-NEXT: 0xE R_X86_64_32S y 0x0 # CHECK-NEXT: 0x23 R_X86_64_32S xx 0x0 |