Skip to content

Commit 7db0a60

Browse files
authored
[objcopy][COFF] Do not strip .rdata section with --only-keep-debug (#121653)
When not in MinGW mode, the PE debug directory is placed in .rdata by the linker instead of .buildid. In addition to .buildid always explicitly preserve the section containing the debug directory to avoid causing errors later in patchDebugDirectory.
1 parent d1d4003 commit 7db0a60

File tree

3 files changed

+117
-1
lines changed

3 files changed

+117
-1
lines changed

llvm/lib/ObjCopy/COFF/COFFObjcopy.cpp

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -183,10 +183,18 @@ static Error handleArgs(const CommonConfig &Config,
183183
});
184184

185185
if (Config.OnlyKeepDebug) {
186+
const data_directory *DebugDir =
187+
Obj.DataDirectories.size() > DEBUG_DIRECTORY
188+
? &Obj.DataDirectories[DEBUG_DIRECTORY]
189+
: nullptr;
186190
// For --only-keep-debug, we keep all other sections, but remove their
187191
// content. The VirtualSize field in the section header is kept intact.
188-
Obj.truncateSections([](const Section &Sec) {
192+
Obj.truncateSections([DebugDir](const Section &Sec) {
189193
return !isDebugSection(Sec) && Sec.Name != ".buildid" &&
194+
!(DebugDir && DebugDir->Size > 0 &&
195+
DebugDir->RelativeVirtualAddress >= Sec.Header.VirtualAddress &&
196+
DebugDir->RelativeVirtualAddress <
197+
Sec.Header.VirtualAddress + Sec.Header.SizeOfRawData) &&
190198
((Sec.Header.Characteristics &
191199
(IMAGE_SCN_CNT_CODE | IMAGE_SCN_CNT_INITIALIZED_DATA)) != 0);
192200
});
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
--- !COFF
2+
OptionalHeader:
3+
AddressOfEntryPoint: 4096
4+
ImageBase: 268435456
5+
SectionAlignment: 4096
6+
FileAlignment: 512
7+
MajorOperatingSystemVersion: 6
8+
MinorOperatingSystemVersion: 0
9+
MajorImageVersion: 0
10+
MinorImageVersion: 0
11+
MajorSubsystemVersion: 6
12+
MinorSubsystemVersion: 0
13+
Subsystem: IMAGE_SUBSYSTEM_WINDOWS_CUI
14+
DLLCharacteristics: [ ]
15+
SizeOfStackReserve: 1048576
16+
SizeOfStackCommit: 4096
17+
SizeOfHeapReserve: 1048576
18+
SizeOfHeapCommit: 4096
19+
Debug:
20+
RelativeVirtualAddress: 8192
21+
Size: 28
22+
header:
23+
Machine: IMAGE_FILE_MACHINE_I386
24+
Characteristics: [ IMAGE_FILE_EXECUTABLE_IMAGE, IMAGE_FILE_32BIT_MACHINE, IMAGE_FILE_DLL ]
25+
sections:
26+
- Name: .text
27+
Characteristics: [ IMAGE_SCN_CNT_CODE, IMAGE_SCN_MEM_EXECUTE, IMAGE_SCN_MEM_READ ]
28+
VirtualAddress: 4096
29+
VirtualSize: 18
30+
SectionData: 5589E58B45108B450C8B450831C05DC20C00
31+
SizeOfRawData: 512
32+
- Name: .rdata
33+
Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_MEM_READ ]
34+
VirtualAddress: 8192
35+
VirtualSize: 109
36+
SectionData: 000000008D6978670000000002000000510000001C2000001C060000525344538B301061671ED0994C4C44205044422E010000002F686F6D652F6D652F446F63756D656E74732F6C6C766D2D6D696E67772F6C6C766D2D70726F6A6563742F6C6C766D2F746573742E70646200
37+
SizeOfRawData: 512
38+
- Name: .debug_abbrev
39+
Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_MEM_DISCARDABLE, IMAGE_SCN_MEM_READ ]
40+
VirtualAddress: 12288
41+
VirtualSize: 78
42+
SectionData: 011101250E1305030E10171B0E110112060000022E011101120640186E0E030E3A0B3B0B2719360B49133F1900000305000218030E3A0B3B0B49130000042400030E3E0B0B0B0000050F00000000
43+
SizeOfRawData: 512
44+
- Name: .debug_info
45+
Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_MEM_DISCARDABLE, IMAGE_SCN_MEM_READ ]
46+
VirtualAddress: 16384
47+
VirtualSize: 116
48+
SectionData: 700000000400000000000401000000001D006E000000000000007500000000100010120000000200100010120000000155A5000000BC0000000101B16B00000003029108D70000000101720000000302910CD500000001016B00000003029110D30000000101720000000004CF00000005040500
49+
SizeOfRawData: 512
50+
- Name: .debug_line
51+
Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_MEM_DISCARDABLE, IMAGE_SCN_MEM_READ ]
52+
VirtualAddress: 20480
53+
VirtualSize: 60
54+
SectionData: 3800000004001E000000010101FB0E0D00010101010000000100000100746573742E6300000000000005020010001001053D0ABA060B2E0204000101
55+
SizeOfRawData: 512
56+
- Name: .debug_str
57+
Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_MEM_DISCARDABLE, IMAGE_SCN_MEM_READ ]
58+
VirtualAddress: 24576
59+
VirtualSize: 217
60+
SectionData: 636C616E672076657273696F6E2032302E302E30676974202868747470733A2F2F6769746875622E636F6D2F62796C6177732F6C6C766D2D70726F6A6563742E67697420393963353263306236613662396366303765383365656265393364323831333635656165383732332900746573742E63002F686F6D652F6D652F446F63756D656E74732F6C6C766D2D6D696E67772F6C6C766D2D70726F6A6563742F6C6C766D005F5F446C6C4D61696E43525453746172747570403132005F446C6C4D61696E4352545374617274757000696E7400630062006100
61+
SizeOfRawData: 512
62+
symbols: []
63+
...
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
RUN: yaml2obj %p/Inputs/i386-debug-rdata.yaml -o %t.in.exe
2+
3+
RUN: llvm-objcopy --only-keep-debug %t.in.exe %t.out.exe
4+
RUN: llvm-readobj --sections %t.out.exe | FileCheck %s
5+
6+
Check that all non-debug/rodata (which contains the debug directory in this case)
7+
sections with IMAGE_SCN_CNT_CODE or IMAGE_SCN_CNT_INITIALIZED_DATA are truncated,
8+
and no others.
9+
10+
CHECK: Section {
11+
CHECK-NEXT: Number: 1
12+
CHECK-NEXT: Name: .text (2E 74 65 78 74 00 00 00)
13+
CHECK-NEXT: VirtualSize: 0x12
14+
CHECK-NEXT: VirtualAddress: 0x1000
15+
CHECK-NEXT: RawDataSize: 0
16+
CHECK: Section {
17+
CHECK-NEXT: Number: 2
18+
CHECK-NEXT: Name: .rdata (2E 72 64 61 74 61 00 00)
19+
CHECK-NEXT: VirtualSize: 0x6D
20+
CHECK-NEXT: VirtualAddress: 0x2000
21+
CHECK-NEXT: RawDataSize: 512
22+
CHECK: Section {
23+
CHECK-NEXT: Number: 3
24+
CHECK-NEXT: Name: .debug_abbrev (2F 34 00 00 00 00 00 00)
25+
CHECK-NEXT: VirtualSize: 0x4E
26+
CHECK-NEXT: VirtualAddress: 0x3000
27+
CHECK-NEXT: RawDataSize: 512
28+
CHECK: Section {
29+
CHECK-NEXT: Number: 4
30+
CHECK-NEXT: Name: .debug_info (2F 32 39 00 00 00 00 00)
31+
CHECK-NEXT: VirtualSize: 0x74
32+
CHECK-NEXT: VirtualAddress: 0x4000
33+
CHECK-NEXT: RawDataSize: 512
34+
CHECK: Section {
35+
CHECK-NEXT: Number: 5
36+
CHECK-NEXT: Name: .debug_line (2F 34 31 00 00 00 00 00)
37+
CHECK-NEXT: VirtualSize: 0x3C
38+
CHECK-NEXT: VirtualAddress: 0x5000
39+
CHECK-NEXT: RawDataSize: 512
40+
CHECK: Section {
41+
CHECK-NEXT: Number: 6
42+
CHECK-NEXT: Name: .debug_str (2F 31 38 00 00 00 00 00)
43+
CHECK-NEXT: VirtualSize: 0xD9
44+
CHECK-NEXT: VirtualAddress: 0x6000
45+
CHECK-NEXT: RawDataSize: 512

0 commit comments

Comments
 (0)