Index: test/tools/llvm-objcopy/strip-all-gnu.test =================================================================== --- /dev/null +++ test/tools/llvm-objcopy/strip-all-gnu.test @@ -0,0 +1,54 @@ +# RUN: yaml2obj %s > %t +# RUN: llvm-objcopy --strip-all-gnu %t %t2 +# RUN: llvm-readobj -file-headers -sections %t2 | FileCheck %s + +!ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_X86_64 +Sections: + - Name: .dynstr + Type: SHT_STRTAB + Flags: [ SHF_ALLOC ] + - Name: .symtab.dyn + Type: SHT_SYMTAB + Flags: [ SHF_ALLOC ] + Type: SHT_NOBITS + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + Size: 4 + - Name: .debug_info + Type: SHT_PROGBITS + Flags: [ ] + AddressAlign: 0x1 + Size: 4 + - Name: .debug_loc + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC ] + AddressAlign: 0x1 + Size: 4 + - Name: .comment + Type: SHT_PROGBITS + - Name: .random_section_name + Type: SHT_PROGBITS + - Name: .debug_not_a_real_debug_section + Type: SHT_PROGBITS + - Name: .rel.text + Type: SHT_REL + Info: .text + - Name: .rela.text + Type: SHT_RELA + Info: .text + +# CHECK: SectionHeaderCount: 8 + +# CHECK: Name: .dynstr +# CHECK: Name: .symtab.dyn +# CHECK: Name: .text +# CHECK: Name: .debug_loc +# CHECK: Name: .comment +# CHECK: Name: .random_section_name +# CHECK: Name: .shstrtab Index: test/tools/llvm-objcopy/strip-all.test =================================================================== --- test/tools/llvm-objcopy/strip-all.test +++ test/tools/llvm-objcopy/strip-all.test @@ -9,46 +9,21 @@ Type: ET_REL Machine: EM_X86_64 Sections: - - Name: .dynstr - Type: SHT_STRTAB - Flags: [ SHF_ALLOC ] - - Name: .symtab.dyn - Type: SHT_SYMTAB - Flags: [ SHF_ALLOC ] + - Name: .bss Type: SHT_NOBITS + Flags: [ SHF_ALLOC ] - Name: .text Type: SHT_PROGBITS Flags: [ SHF_ALLOC, SHF_EXECINSTR ] - Size: 4 - - Name: .debug_info + - Name: .blarg Type: SHT_PROGBITS Flags: [ ] - AddressAlign: 0x1 - Size: 4 - - Name: .debug_loc - Type: SHT_PROGBITS - Flags: [ SHF_ALLOC ] - AddressAlign: 0x1 - Size: 4 - - Name: .comment - Type: SHT_PROGBITS - - Name: .random_section_name - Type: SHT_PROGBITS - - Name: .debug_not_a_real_debug_section + - Name: .gnu.warning.foo Type: SHT_PROGBITS - - Name: .rel.text - Type: SHT_REL - Info: .text - - Name: .rela.text - Type: SHT_RELA - Info: .text -# CHECK: SectionHeaderCount: 8 +# CHECK: SectionHeaderCount: 5 -# CHECK: Name: .dynstr -# CHECK: Name: .symtab.dyn -# CHECK: Name: .text -# CHECK: Name: .debug_loc -# CHECK: Name: .comment -# CHECK: Name: .random_section_name -# CHECK: Name: .shstrtab +# CHECK: Name: .bss +# CHECK: Name: .text +# CHECK: Name: .gnu.warning.foo +# CHECK: Name: .shstrtab Index: tools/llvm-objcopy/llvm-objcopy.cpp =================================================================== --- tools/llvm-objcopy/llvm-objcopy.cpp +++ tools/llvm-objcopy/llvm-objcopy.cpp @@ -82,8 +82,13 @@ cl::value_desc("section")); static cl::alias ToRemoveA("R", cl::desc("Alias for remove-section"), cl::aliasopt(ToRemove)); -static cl::opt StripAll("strip-all", - cl::desc("Removes symbol, relocation, and debug information")); +static cl::opt StripAll( + "strip-all", + cl::desc( + "Removes non-allocated sections other than .gnu.warning* sections")); +static cl::opt + StripAllGNU("strip-all-gnu", + cl::desc("Removes symbol, relocation, and debug information")); static cl::opt StripDebug("strip-debug", cl::desc("Removes all debug information")); static cl::opt StripSections("strip-sections", @@ -178,7 +183,7 @@ return OnlyKeepDWOPred(*Obj, Sec) || RemovePred(Sec); }; - if (StripAll) + if (StripAllGNU) RemovePred = [RemovePred, &Obj](const SectionBase &Sec) { if (RemovePred(Sec)) return true; @@ -218,6 +223,17 @@ return (Sec.Flags & SHF_ALLOC) == 0; }; + if (StripAll) + RemovePred = [RemovePred, &Obj](const SectionBase &Sec) { + if (RemovePred(Sec)) + return true; + if (&Sec == Obj->getSectionHeaderStrTab()) + return false; + if (Sec.Name.startswith(".gnu.warning")) + return false; + return (Sec.Flags & SHF_ALLOC) == 0; + }; + Obj->removeSections(RemovePred); Obj->finalize(); WriteObjectFile(*Obj, OutputFilename.getValue());