diff options
| -rw-r--r-- | llvm/test/tools/llvm-objcopy/strip-all.test | 54 | ||||
| -rw-r--r-- | llvm/tools/llvm-objcopy/llvm-objcopy.cpp | 20 |
2 files changed, 74 insertions, 0 deletions
diff --git a/llvm/test/tools/llvm-objcopy/strip-all.test b/llvm/test/tools/llvm-objcopy/strip-all.test new file mode 100644 index 00000000000..fc0ae034299 --- /dev/null +++ b/llvm/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 diff --git a/llvm/tools/llvm-objcopy/llvm-objcopy.cpp b/llvm/tools/llvm-objcopy/llvm-objcopy.cpp index 54186f63c07..12d6205722f 100644 --- a/llvm/tools/llvm-objcopy/llvm-objcopy.cpp +++ b/llvm/tools/llvm-objcopy/llvm-objcopy.cpp @@ -81,6 +81,8 @@ static cl::list<std::string> ToRemove("remove-section", cl::desc("Remove a specific section")); static cl::alias ToRemoveA("R", cl::desc("Alias for remove-section"), cl::aliasopt(ToRemove)); +static cl::opt<bool> StripAll("strip-all", + cl::desc("Removes symbol, relocation, and debug information")); static cl::opt<bool> StripSections("strip-sections", cl::desc("Remove all section headers")); static cl::opt<bool> @@ -170,6 +172,24 @@ void CopyBinary(const ELFObjectFile<ELF64LE> &ObjFile) { 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; |

