Skip to content

Commit

Permalink
[llvm-objcopy] [COFF] Implement --only-keep-debug
Browse files Browse the repository at this point in the history
Differential Revision: https://reviews.llvm.org/D56840

llvm-svn: 351662
  • Loading branch information
mstorsjo committed Jan 19, 2019
1 parent 78a0b41 commit 1868d88
Show file tree
Hide file tree
Showing 5 changed files with 156 additions and 0 deletions.
77 changes: 77 additions & 0 deletions llvm/test/tools/llvm-objcopy/COFF/Inputs/only-keep-sections.yaml
@@ -0,0 +1,77 @@
--- !COFF
OptionalHeader:
AddressOfEntryPoint: 4144
ImageBase: 1073741824
SectionAlignment: 4096
FileAlignment: 512
MajorOperatingSystemVersion: 6
MinorOperatingSystemVersion: 0
MajorImageVersion: 0
MinorImageVersion: 0
MajorSubsystemVersion: 6
MinorSubsystemVersion: 0
Subsystem: IMAGE_SUBSYSTEM_WINDOWS_CUI
DLLCharacteristics: [ ]
SizeOfStackReserve: 1048576
SizeOfStackCommit: 4096
SizeOfHeapReserve: 1048576
SizeOfHeapCommit: 4096
header:
Machine: IMAGE_FILE_MACHINE_AMD64
Characteristics: [ ]
sections:
- Name: .text
Characteristics: [ IMAGE_SCN_CNT_CODE ]
VirtualAddress: 4096
VirtualSize: 4
SectionData: C3C3C3C3
- Name: .rdata
Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA ]
VirtualAddress: 8192
VirtualSize: 4
SectionData: 2A000000
- Name: .buildid
Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA ]
VirtualAddress: 12288
VirtualSize: 4
SectionData: 2B000000
- Name: .reloc
Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_MEM_DISCARDABLE ]
VirtualAddress: 16384
VirtualSize: 4
SectionData: 2C000000
- Name: .debug_discardable
Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_MEM_DISCARDABLE ]
VirtualAddress: 20480
VirtualSize: 4
SectionData: 2D000000
- Name: .debug_undiscardable
Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA ]
VirtualAddress: 24576
VirtualSize: 4
SectionData: 2E000000
- Name: .unflagged
Characteristics: [ ]
VirtualAddress: 28672
VirtualSize: 4
SectionData: 2F000000
symbols:
- Name: main
Value: 2
SectionNumber: 1
SimpleType: IMAGE_SYM_TYPE_NULL
ComplexType: IMAGE_SYM_DTYPE_FUNCTION
StorageClass: IMAGE_SYM_CLASS_EXTERNAL
- Name: debug_discardable_sym
Value: 0
SectionNumber: 5
SimpleType: IMAGE_SYM_TYPE_NULL
ComplexType: IMAGE_SYM_DTYPE_FUNCTION
StorageClass: IMAGE_SYM_CLASS_EXTERNAL
- Name: debug_undiscardable_sym
Value: 0
SectionNumber: 6
SimpleType: IMAGE_SYM_TYPE_NULL
ComplexType: IMAGE_SYM_DTYPE_FUNCTION
StorageClass: IMAGE_SYM_CLASS_EXTERNAL
...
58 changes: 58 additions & 0 deletions llvm/test/tools/llvm-objcopy/COFF/only-keep-debug.test
@@ -0,0 +1,58 @@
RUN: yaml2obj %p/Inputs/only-keep-sections.yaml > %t.in.exe

RUN: llvm-objcopy --only-keep-debug %t.in.exe %t.out.exe
RUN: llvm-readobj --sections %t.out.exe | FileCheck %s --check-prefix=SECTIONS
RUN: llvm-objdump -t %t.out.exe | FileCheck %s --check-prefix=SYMBOLS

Check that all non-debug/buildid sections with IMAGE_SCN_CNT_CODE
or IMAGE_SCN_CNT_INITIALIZED_DATA are truncated, and no others.

SECTIONS: Sections [
SECTIONS-NEXT: Section {
SECTIONS-NEXT: Number: 1
SECTIONS-NEXT: Name: .text
SECTIONS-NEXT: VirtualSize: 0x4
SECTIONS-NEXT: VirtualAddress:
SECTIONS-NEXT: RawDataSize: 0
SECTIONS: Section {
SECTIONS-NEXT: Number: 2
SECTIONS-NEXT: Name: .rdata
SECTIONS-NEXT: VirtualSize: 0x4
SECTIONS-NEXT: VirtualAddress:
SECTIONS-NEXT: RawDataSize: 0
SECTIONS: Section {
SECTIONS-NEXT: Number: 3
SECTIONS-NEXT: Name: .buildid
SECTIONS-NEXT: VirtualSize: 0x4
SECTIONS-NEXT: VirtualAddress:
SECTIONS-NEXT: RawDataSize: 512
SECTIONS: Section {
SECTIONS-NEXT: Number: 4
SECTIONS-NEXT: Name: .reloc
SECTIONS-NEXT: VirtualSize: 0x4
SECTIONS-NEXT: VirtualAddress:
SECTIONS-NEXT: RawDataSize: 0
SECTIONS: Section {
SECTIONS-NEXT: Number: 5
SECTIONS-NEXT: Name: .debug_discardable
SECTIONS-NEXT: VirtualSize: 0x4
SECTIONS-NEXT: VirtualAddress:
SECTIONS-NEXT: RawDataSize: 512
SECTIONS: Section {
SECTIONS-NEXT: Number: 6
SECTIONS-NEXT: Name: .debug_undiscardable
SECTIONS-NEXT: VirtualSize: 0x4
SECTIONS-NEXT: VirtualAddress:
SECTIONS-NEXT: RawDataSize: 512
SECTIONS: Section {
SECTIONS-NEXT: Number: 7
SECTIONS-NEXT: Name: .unflagged
SECTIONS-NEXT: VirtualSize: 0x4
SECTIONS-NEXT: VirtualAddress:
SECTIONS-NEXT: RawDataSize: 512

SYMBOLS: SYMBOL TABLE:
SYMBOLS-NEXT: main
SYMBOLS-NEXT: debug_discardable_sym
SYMBOLS-NEXT: debug_undiscardable_sym
SYMBOLS-EMPTY:
10 changes: 10 additions & 0 deletions llvm/tools/llvm-objcopy/COFF/COFFObjcopy.cpp
Expand Up @@ -46,6 +46,16 @@ static Error handleArgs(const CopyConfig &Config, Object &Obj) {
return false;
});

if (Config.OnlyKeepDebug) {
// For --only-keep-debug, we keep all other sections, but remove their
// content. The VirtualSize field in the section header is kept intact.
Obj.truncateSections([](const Section &Sec) {
return !isDebugSection(Sec) && Sec.Name != ".buildid" &&
((Sec.Header.Characteristics &
(IMAGE_SCN_CNT_CODE | IMAGE_SCN_CNT_INITIALIZED_DATA)) != 0);
});
}

// StripAll removes all symbols and thus also removes all relocations.
if (Config.StripAll || Config.StripAllGNU)
for (Section &Sec : Obj.getMutableSections())
Expand Down
10 changes: 10 additions & 0 deletions llvm/tools/llvm-objcopy/COFF/Object.cpp
Expand Up @@ -127,6 +127,16 @@ void Object::removeSections(function_ref<bool(const Section &)> ToRemove) {
updateSymbols();
}

void Object::truncateSections(function_ref<bool(const Section &)> ToTruncate) {
for (Section &Sec : Sections) {
if (ToTruncate(Sec)) {
Sec.Contents = ArrayRef<uint8_t>();
Sec.Relocs.clear();
Sec.Header.SizeOfRawData = 0;
}
}
}

} // end namespace coff
} // end namespace objcopy
} // end namespace llvm
1 change: 1 addition & 0 deletions llvm/tools/llvm-objcopy/COFF/Object.h
Expand Up @@ -93,6 +93,7 @@ struct Object {

void addSections(ArrayRef<Section> NewSections);
void removeSections(function_ref<bool(const Section &)> ToRemove);
void truncateSections(function_ref<bool(const Section &)> ToTruncate);

private:
std::vector<Symbol> Symbols;
Expand Down

0 comments on commit 1868d88

Please sign in to comment.