Index: test/tools/llvm-objcopy/COFF/only-keep-debug.yaml =================================================================== --- /dev/null +++ test/tools/llvm-objcopy/COFF/only-keep-debug.yaml @@ -0,0 +1,137 @@ +# RUN: yaml2obj %s > %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 are truncated, but only ones +# that actually had IMAGE_SCN_CNT_CODE or IMAGE_SCN_CNT_INITIALIZED_DATA +# set. + +# 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: + +--- !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 +... Index: tools/llvm-objcopy/COFF/COFFObjcopy.cpp =================================================================== --- tools/llvm-objcopy/COFF/COFFObjcopy.cpp +++ tools/llvm-objcopy/COFF/COFFObjcopy.cpp @@ -31,7 +31,22 @@ return Sec.Name.startswith(".debug"); } +static bool isNondebugKeepableSection(const Section &Sec) { + return Sec.Name == ".buildid"; +} + static Error handleArgs(const CopyConfig &Config, Object &Obj) { + if (Config.OnlyKeepDebug) { + // For --only-keep-debug, we keep all other sections, but remove + // their content data. The VirtualSize field in the section header + // is kept intact. + Obj.truncateSections([](const Section &Sec) { + return !isDebugSection(Sec) && !isNondebugKeepableSection(Sec) && + ((Sec.Header.Characteristics & + (IMAGE_SCN_CNT_CODE | IMAGE_SCN_CNT_INITIALIZED_DATA)) != 0); + }); + } + // Perform the actual section removals. Obj.removeSections([&Config](const Section &Sec) { if (Config.StripDebug || Config.StripAll || Config.StripAllGNU || Index: tools/llvm-objcopy/COFF/Object.h =================================================================== --- tools/llvm-objcopy/COFF/Object.h +++ tools/llvm-objcopy/COFF/Object.h @@ -94,6 +94,7 @@ void addSections(ArrayRef
NewSections); void removeSections(function_ref ToRemove); + void truncateSections(function_ref ToTruncate); private: std::vector Symbols; Index: tools/llvm-objcopy/COFF/Object.cpp =================================================================== --- tools/llvm-objcopy/COFF/Object.cpp +++ tools/llvm-objcopy/COFF/Object.cpp @@ -128,6 +128,16 @@ updateSymbols(); } +void Object::truncateSections(function_ref ToTruncate) { + for (Section &Sec : Sections) { + if (ToTruncate(Sec)) { + Sec.Contents = ArrayRef(); + Sec.Relocs.clear(); + Sec.Header.SizeOfRawData = 0; + } + } +} + } // end namespace coff } // end namespace objcopy } // end namespace llvm