Index: test/tools/llvm-objcopy/strip-all.test =================================================================== --- /dev/null +++ test/tools/llvm-objcopy/strip-all.test @@ -0,0 +1,46 @@ +# 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: .bss + Type: SHT_NOBITS + Flags: [ SHF_ALLOC ] + AddressAlign: 0x0000000000000010 + Size: 4 + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000010 + 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 + +# CHECK: SectionHeaderCount: 7 + +# CHECK: Name: .bss +# CHECK: Name: .text +# CHECK: Name: .debug_loc +# CHECK: Name: .comment +# CHECK: Name: .random_section_name +# CHECK: Name: .shstrtab Index: tools/llvm-objcopy/llvm-objcopy.cpp =================================================================== --- tools/llvm-objcopy/llvm-objcopy.cpp +++ 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 non-allocated sections")); static cl::opt StripSections("strip-sections", cl::desc("Remove all section headers")); static cl::opt @@ -169,6 +171,22 @@ return OnlyKeepDWOPred(*Obj, Sec) || RemovePred(Sec); }; + if (StripAll) + RemovePred = [RemovePred, &Obj](const SectionBase &Sec) { + 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 RemovePred(Sec) || Sec.Name.startswith(".debug_"); + }; + if (StripSections) { RemovePred = [RemovePred](const SectionBase &Sec) { return RemovePred(Sec) || (Sec.Flags & SHF_ALLOC) == 0;