Index: llvm/trunk/test/tools/llvm-objcopy/strip-all.test =================================================================== --- llvm/trunk/test/tools/llvm-objcopy/strip-all.test +++ llvm/trunk/test/tools/llvm-objcopy/strip-all.test @@ -0,0 +1,54 @@ +# RUN: yaml2obj %s > %t +# RUN: llvm-objcopy --strip-all %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: llvm/trunk/tools/llvm-objcopy/llvm-objcopy.cpp =================================================================== --- llvm/trunk/tools/llvm-objcopy/llvm-objcopy.cpp +++ llvm/trunk/tools/llvm-objcopy/llvm-objcopy.cpp @@ -81,6 +81,8 @@ cl::desc("Remove a specific 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 StripSections("strip-sections", cl::desc("Remove all section headers")); static cl::opt @@ -170,6 +172,24 @@ return OnlyKeepDWOPred(*Obj, Sec) || RemovePred(Sec); }; + if (StripAll) + RemovePred = [RemovePred, &Obj](const SectionBase &Sec) { + if (RemovePred(Sec)) + return true; + if ((Sec.Flags & SHF_ALLOC) != 0) + return false; + if (&Sec == Obj->getSectionHeaderStrTab()) + return false; + switch(Sec.Type) { + case SHT_SYMTAB: + case SHT_REL: + case SHT_RELA: + case SHT_STRTAB: + return true; + } + return Sec.Name.startswith(".debug"); + }; + if (StripSections) { RemovePred = [RemovePred](const SectionBase &Sec) { return RemovePred(Sec) || (Sec.Flags & SHF_ALLOC) == 0;