Skip to content

Commit

Permalink
[LLD] [COFF] Order .debug_* sections at the end, to avoid leaving gap…
Browse files Browse the repository at this point in the history
…s if stripped

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
msys2/MINGW-packages#10555.

Differential Revision: https://reviews.llvm.org/D120805

(cherry picked from commit 4c3b74b)
  • Loading branch information
mstorsjo authored and tstellar committed Mar 7, 2022
1 parent e6d2aa9 commit 43b4544
Show file tree
Hide file tree
Showing 2 changed files with 13 additions and 1 deletion.
8 changes: 7 additions & 1 deletion lld/COFF/Writer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -926,8 +926,14 @@ void Writer::createSections() {
// 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).
Expand Down
6 changes: 6 additions & 0 deletions lld/test/COFF/sort-debug.test
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand Down Expand Up @@ -183,6 +185,10 @@ sections:
- 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
Expand Down

0 comments on commit 43b4544

Please sign in to comment.