forked from OSchip/llvm-project
[llvm-objcopy] [COFF] Implement --only-keep-debug
Differential Revision: https://reviews.llvm.org/D56840 llvm-svn: 351662
This commit is contained in:
parent
78a0b418b4
commit
1868d88b2e
|
@ -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
|
||||||
|
...
|
|
@ -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:
|
|
@ -46,6 +46,16 @@ static Error handleArgs(const CopyConfig &Config, Object &Obj) {
|
||||||
return false;
|
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.
|
// StripAll removes all symbols and thus also removes all relocations.
|
||||||
if (Config.StripAll || Config.StripAllGNU)
|
if (Config.StripAll || Config.StripAllGNU)
|
||||||
for (Section &Sec : Obj.getMutableSections())
|
for (Section &Sec : Obj.getMutableSections())
|
||||||
|
|
|
@ -127,6 +127,16 @@ void Object::removeSections(function_ref<bool(const Section &)> ToRemove) {
|
||||||
updateSymbols();
|
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 coff
|
||||||
} // end namespace objcopy
|
} // end namespace objcopy
|
||||||
} // end namespace llvm
|
} // end namespace llvm
|
||||||
|
|
|
@ -93,6 +93,7 @@ struct Object {
|
||||||
|
|
||||||
void addSections(ArrayRef<Section> NewSections);
|
void addSections(ArrayRef<Section> NewSections);
|
||||||
void removeSections(function_ref<bool(const Section &)> ToRemove);
|
void removeSections(function_ref<bool(const Section &)> ToRemove);
|
||||||
|
void truncateSections(function_ref<bool(const Section &)> ToTruncate);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::vector<Symbol> Symbols;
|
std::vector<Symbol> Symbols;
|
||||||
|
|
Loading…
Reference in New Issue