[PATCH] D74887: [ELF] Shuffle .init_array/.fini_array with --shuffle-sections=

Fangrui Song via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Thu Feb 20 09:24:45 PST 2020


MaskRay updated this revision to Diff 245673.
MaskRay added a comment.

Improve tests


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D74887/new/

https://reviews.llvm.org/D74887

Files:
  lld/ELF/Writer.cpp
  lld/test/ELF/shuffle-sections-init-fini.s


Index: lld/test/ELF/shuffle-sections-init-fini.s
===================================================================
--- /dev/null
+++ lld/test/ELF/shuffle-sections-init-fini.s
@@ -0,0 +1,48 @@
+# REQUIRES: x86
+# RUN: llvm-mc -filetype=obj -triple=x86_64 %s -o %t.o
+
+# RUN: ld.lld %t.o -o %t
+# RUN: llvm-readelf -x .init -x .fini -x .init_array -x .fini_array %t | \
+# RUN:   FileCheck --check-prefixes=CHECK,ORDERED %s
+
+# RUN: ld.lld --shuffle-sections=1 %t.o -o %t1
+# RUN: llvm-readelf -x .init -x .fini -x .init_array -x .fini_array %t1 | \
+# RUN:   FileCheck --check-prefixes=CHECK,SHUFFLED %s
+
+## .init and .fini rely on a particular order, e.g. crti.o crtbegin.o crtend.o crtn.o
+## Don't shuffle them.
+# CHECK:      Hex dump of section '.init'
+# CHECK-NEXT: 00010203 04050607 08090a0b
+
+# CHECK:      Hex dump of section '.fini'
+# CHECK-NEXT: 00010203 04050607 08090a0b
+
+## SHT_INIT_ARRAY/SHT_FINI_ARRAY with explicit priorities are still ordered.
+# CHECK:      Hex dump of section '.init_array'
+# CHECK-NEXT: 0x{{[0-9a-f]+}} ff
+# ORDERED-SAME: 000102 03040506 0708090a 0b
+# SHUFFLED-NOT: 000102 03040506 0708090a 0b
+
+# CHECK:      Hex dump of section '.fini_array'
+# CHECK-NEXT: 0x{{[0-9a-f]+}} ff
+# ORDERED-SAME: 000102 03040506 0708090a 0b
+# SHUFFLED-NOT: 000102 03040506 0708090a 0b
+
+## Random number engines have different implementations.
+## When the number of input sections are large, it is almost guaranteed
+## to have an unordered result with --shuffle-sections=.
+.irp i,0,1,2,3,4,5,6,7,8,9,10,11
+  .section .init,"ax", at progbits,unique,\i
+  .byte \i
+  .section .fini,"ax", at progbits,unique,\i
+  .byte \i
+  .section .init_array,"aw", at init_array,unique,\i
+  .byte \i
+  .section .fini_array,"aw", at fini_array,unique,\i
+  .byte \i
+.endr
+
+.section .init_array.1,"aw", at init_array
+.byte 255
+.section .fini_array.1,"aw", at fini_array
+.byte 255
Index: lld/ELF/Writer.cpp
===================================================================
--- lld/ELF/Writer.cpp
+++ lld/ELF/Writer.cpp
@@ -1355,6 +1355,17 @@
                         const DenseMap<const InputSectionBase *, int> &order) {
   StringRef name = sec->name;
 
+  // Never sort these.
+  if (name == ".init" || name == ".fini")
+    return;
+
+  // Sort input sections by priority using the list provided
+  // by --symbol-ordering-file or --shuffle-sections=.
+  if (!order.empty())
+    for (BaseCommand *b : sec->sectionCommands)
+      if (auto *isd = dyn_cast<InputSectionDescription>(b))
+        sortISDBySectionOrder(isd, order);
+
   // Sort input sections by section name suffixes for
   // __attribute__((init_priority(N))).
   if (name == ".init_array" || name == ".fini_array") {
@@ -1370,10 +1381,6 @@
     return;
   }
 
-  // Never sort these.
-  if (name == ".init" || name == ".fini")
-    return;
-
   // .toc is allocated just after .got and is accessed using GOT-relative
   // relocations. Object files compiled with small code model have an
   // addressable range of [.got, .got + 0xFFFC] for GOT-relative relocations.
@@ -1391,13 +1398,6 @@
                       });
     return;
   }
-
-  // Sort input sections by priority using the list provided
-  // by --symbol-ordering-file.
-  if (!order.empty())
-    for (BaseCommand *b : sec->sectionCommands)
-      if (auto *isd = dyn_cast<InputSectionDescription>(b))
-        sortISDBySectionOrder(isd, order);
 }
 
 // If no layout was provided by linker script, we want to apply default


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D74887.245673.patch
Type: text/x-patch
Size: 3473 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20200220/0df1cb57/attachment.bin>


More information about the llvm-commits mailing list