From 237a48e816fd2a3f7ead3f029bb331078ffa94cc Mon Sep 17 00:00:00 2001 From: Jake Ehrlich Date: Mon, 27 Nov 2017 18:56:01 +0000 Subject: [PATCH] [llvm-objcopy] Add --strip-all-gnu and change --strip-all GNU's --strip-all doesn't strip as aggressively as it could in general. Currently llvm-objcopy copies the exact behavoir of GNU's --strip-all. eu-strip is used as a drop in replacement for GNU strip/objcopy in many many places without issue. eu-strip removes non-allocated sections and keeps .gnu.warning* sections. Because --strip-all will likely be the most widely used stripping option we should make --strip-all as aggressive as it can safely be. Since we have evidence from eu-strip that this is a safe option we should allow it. For those that might still have an issue afterwards I've added --strip-all-gnu as an exact drop in replacement for GNU's --strip-all as well. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@319071 91177308-0d34-0410-b5e6-96231b3b80d8 --- test/tools/llvm-objcopy/strip-all-gnu.test | 54 ++++++++++++++++++++++++++++++ test/tools/llvm-objcopy/strip-all.test | 43 +++++------------------- tools/llvm-objcopy/llvm-objcopy.cpp | 22 ++++++++++-- 3 files changed, 82 insertions(+), 37 deletions(-) create mode 100644 test/tools/llvm-objcopy/strip-all-gnu.test diff --git a/test/tools/llvm-objcopy/strip-all-gnu.test b/test/tools/llvm-objcopy/strip-all-gnu.test new file mode 100644 index 00000000000..48d34e8f064 --- /dev/null +++ b/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 diff --git a/test/tools/llvm-objcopy/strip-all.test b/test/tools/llvm-objcopy/strip-all.test index fc0ae034299..3e6d0d0222f 100644 --- a/test/tools/llvm-objcopy/strip-all.test +++ b/test/tools/llvm-objcopy/strip-all.test @@ -9,46 +9,21 @@ FileHeader: 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 diff --git a/tools/llvm-objcopy/llvm-objcopy.cpp b/tools/llvm-objcopy/llvm-objcopy.cpp index ee7785557b3..09553e85202 100644 --- a/tools/llvm-objcopy/llvm-objcopy.cpp +++ b/tools/llvm-objcopy/llvm-objcopy.cpp @@ -82,8 +82,13 @@ static cl::list ToRemove("remove-section", 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 @@ void CopyBinary(const ELFObjectFile &ObjFile) { 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 @@ void CopyBinary(const ELFObjectFile &ObjFile) { 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()); -- 2.11.0