summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lld/ELF/Writer.cpp4
-rw-r--r--lld/test/ELF/arm-exidx-relocatable.s51
-rw-r--r--lld/test/ELF/arm-use-r-output.s12
-rw-r--r--lld/test/ELF/relocatable-sections.s4
-rw-r--r--lld/test/ELF/relocatable.s2
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
OpenPOWER on IntegriCloud