[PATCH] D120805: [LLD] [COFF] Order .debug_* sections at the end, to avoid leaving gaps if stripped

Martin Storsjö via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Wed Mar 2 02:50:48 PST 2022


mstorsjo created this revision.
mstorsjo added reviewers: rnk, mati865, jeremyd2019.
Herald added a subscriber: JDevlieghere.
Herald added a project: All.
mstorsjo requested review of this revision.
Herald added a project: LLVM.

So far, we sort all discardable sections at the end, with only some
extra logic to make sure that the .reloc section is at the start
of that group of sections. But if there are other discardable
sections, other than .reloc, they must also be ordered before
.debug_* sections, to avoid leaving gaps if the executable is
stripped.

(Stripping executables doesn't remove all discardable sections,
only the ones named .debug_*).

Rust binaries seem to include a .rmeta section, which is marked
discardable. This fixes stripping such binaries if built with
dwarf debug info included.

This fixes issues observed in MSYS2 in
https://github.com/msys2/MINGW-packages/pull/10555.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D120805

Files:
  lld/COFF/Writer.cpp
  lld/test/COFF/sort-debug.test


Index: lld/test/COFF/sort-debug.test
===================================================================
--- lld/test/COFF/sort-debug.test
+++ lld/test/COFF/sort-debug.test
@@ -10,6 +10,7 @@
 
 # CHECK: Name: .text
 # CHECK: Name: .reloc
+# CHECK: Name: .rmeta
 # CHECK: Name: .debug_abbrev
 # CHECK: Name: .debug_info
 # CHECK: Name: .debug_line
@@ -18,6 +19,7 @@
 
 # NODEBUG: Name: .text
 # NODEBUG: Name: .reloc
+# NODEBUG: Name: .rmeta
 # NODEBUG-NOT: Name: .debug_abbrev
 # NODEBUG-NOT: Name: .debug_info
 # NODEBUG-NOT: Name: .debug_line
@@ -183,6 +185,10 @@
       - VirtualAddress:  43
         SymbolName:      .text
         Type:            IMAGE_REL_I386_DIR32
+  - Name:            .rmeta
+    Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_MEM_DISCARDABLE, IMAGE_SCN_MEM_READ ]
+    Alignment:       1
+    SectionData:     00112233
 symbols:
   - Name:            .text
     Value:           0
Index: lld/COFF/Writer.cpp
===================================================================
--- lld/COFF/Writer.cpp
+++ lld/COFF/Writer.cpp
@@ -928,8 +928,14 @@
     // Move DISCARDABLE (or non-memory-mapped) sections to the end of file
     // because the loader cannot handle holes. Stripping can remove other
     // discardable ones than .reloc, which is first of them (created early).
-    if (s->header.Characteristics & IMAGE_SCN_MEM_DISCARDABLE)
+    if (s->header.Characteristics & IMAGE_SCN_MEM_DISCARDABLE) {
+      // Move discardable sections named .debug_ to the end, after other
+      // discardable sections. Stripping only removes the sections named
+      // .debug_* - thus try to avoid leaving holes after stripping.
+      if (s->name.startswith(".debug_"))
+        return 3;
       return 2;
+    }
     // .rsrc should come at the end of the non-discardable sections because its
     // size may change by the Win32 UpdateResources() function, causing
     // subsequent sections to move (see https://crbug.com/827082).


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D120805.412364.patch
Type: text/x-patch
Size: 1972 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20220302/a980e104/attachment.bin>


More information about the llvm-commits mailing list