[lld] r286659 - Don't sort sections in -r links.

Rafael Espindola via llvm-commits llvm-commits at lists.llvm.org
Fri Nov 11 14:43:27 PST 2016


Author: rafael
Date: Fri Nov 11 16:43:27 2016
New Revision: 286659

URL: http://llvm.org/viewvc/llvm-project?rev=286659&view=rev
Log:
Don't sort sections in -r links.

Unlike gold, bfd, gas or MC we were putting exidx sections first since
they are ro.

The spec doesn't explicitly say that they must come after, but it is
definitely more convenient for the consumer, matches other producers
and matches other areas in ELF (like SHT_GROUP) where sections are
ordered in a natural way.

Added:
    lld/trunk/test/ELF/arm-use-r-output.s
Modified:
    lld/trunk/ELF/Writer.cpp
    lld/trunk/test/ELF/arm-exidx-relocatable.s
    lld/trunk/test/ELF/relocatable-sections.s
    lld/trunk/test/ELF/relocatable.s

Modified: lld/trunk/ELF/Writer.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Writer.cpp?rev=286659&r1=286658&r2=286659&view=diff
==============================================================================
--- lld/trunk/ELF/Writer.cpp (original)
+++ lld/trunk/ELF/Writer.cpp Fri Nov 11 16:43:27 2016
@@ -778,6 +778,10 @@ static bool canSharePtLoad(const OutputS
 }
 
 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>);

Modified: lld/trunk/test/ELF/arm-exidx-relocatable.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/arm-exidx-relocatable.s?rev=286659&r1=286658&r2=286659&view=diff
==============================================================================
--- lld/trunk/test/ELF/arm-exidx-relocatable.s (original)
+++ lld/trunk/test/ELF/arm-exidx-relocatable.s Fri Nov 11 16:43:27 2016
@@ -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

Added: lld/trunk/test/ELF/arm-use-r-output.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/arm-use-r-output.s?rev=286659&view=auto
==============================================================================
--- lld/trunk/test/ELF/arm-use-r-output.s (added)
+++ lld/trunk/test/ELF/arm-use-r-output.s Fri Nov 11 16:43:27 2016
@@ -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

Modified: lld/trunk/test/ELF/relocatable-sections.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/relocatable-sections.s?rev=286659&r1=286658&r2=286659&view=diff
==============================================================================
--- lld/trunk/test/ELF/relocatable-sections.s (original)
+++ lld/trunk/test/ELF/relocatable-sections.s Fri Nov 11 16:43:27 2016
@@ -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

Modified: lld/trunk/test/ELF/relocatable.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/relocatable.s?rev=286659&r1=286658&r2=286659&view=diff
==============================================================================
--- lld/trunk/test/ELF/relocatable.s (original)
+++ lld/trunk/test/ELF/relocatable.s Fri Nov 11 16:43:27 2016
@@ -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




More information about the llvm-commits mailing list