[llvm] r351662 - [llvm-objcopy] [COFF] Implement --only-keep-debug
Martin Storsjo via llvm-commits
llvm-commits at lists.llvm.org
Sat Jan 19 11:42:49 PST 2019
Author: mstorsjo
Date: Sat Jan 19 11:42:48 2019
New Revision: 351662
URL: http://llvm.org/viewvc/llvm-project?rev=351662&view=rev
Log:
[llvm-objcopy] [COFF] Implement --only-keep-debug
Differential Revision: https://reviews.llvm.org/D56840
Added:
llvm/trunk/test/tools/llvm-objcopy/COFF/Inputs/only-keep-sections.yaml
llvm/trunk/test/tools/llvm-objcopy/COFF/only-keep-debug.test
Modified:
llvm/trunk/tools/llvm-objcopy/COFF/COFFObjcopy.cpp
llvm/trunk/tools/llvm-objcopy/COFF/Object.cpp
llvm/trunk/tools/llvm-objcopy/COFF/Object.h
Added: llvm/trunk/test/tools/llvm-objcopy/COFF/Inputs/only-keep-sections.yaml
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-objcopy/COFF/Inputs/only-keep-sections.yaml?rev=351662&view=auto
==============================================================================
--- llvm/trunk/test/tools/llvm-objcopy/COFF/Inputs/only-keep-sections.yaml (added)
+++ llvm/trunk/test/tools/llvm-objcopy/COFF/Inputs/only-keep-sections.yaml Sat Jan 19 11:42:48 2019
@@ -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
+...
Added: llvm/trunk/test/tools/llvm-objcopy/COFF/only-keep-debug.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-objcopy/COFF/only-keep-debug.test?rev=351662&view=auto
==============================================================================
--- llvm/trunk/test/tools/llvm-objcopy/COFF/only-keep-debug.test (added)
+++ llvm/trunk/test/tools/llvm-objcopy/COFF/only-keep-debug.test Sat Jan 19 11:42:48 2019
@@ -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:
Modified: llvm/trunk/tools/llvm-objcopy/COFF/COFFObjcopy.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-objcopy/COFF/COFFObjcopy.cpp?rev=351662&r1=351661&r2=351662&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-objcopy/COFF/COFFObjcopy.cpp (original)
+++ llvm/trunk/tools/llvm-objcopy/COFF/COFFObjcopy.cpp Sat Jan 19 11:42:48 2019
@@ -46,6 +46,16 @@ static Error handleArgs(const CopyConfig
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())
Modified: llvm/trunk/tools/llvm-objcopy/COFF/Object.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-objcopy/COFF/Object.cpp?rev=351662&r1=351661&r2=351662&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-objcopy/COFF/Object.cpp (original)
+++ llvm/trunk/tools/llvm-objcopy/COFF/Object.cpp Sat Jan 19 11:42:48 2019
@@ -127,6 +127,16 @@ void Object::removeSections(function_ref
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
Modified: llvm/trunk/tools/llvm-objcopy/COFF/Object.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-objcopy/COFF/Object.h?rev=351662&r1=351661&r2=351662&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-objcopy/COFF/Object.h (original)
+++ llvm/trunk/tools/llvm-objcopy/COFF/Object.h Sat Jan 19 11:42:48 2019
@@ -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;
More information about the llvm-commits
mailing list