From e8dc6a1139148c1e08bf7b76bd82894375cd5ff4 Mon Sep 17 00:00:00 2001 From: Jordan Rupprecht Date: Wed, 10 Jul 2019 23:32:44 +0000 Subject: [PATCH] Revert [llvm-objcopy] Allow strip symtab from executables and DSOs This reverts r365193 (git commit 194f16b3548bcb23a7f0fd638778ed72edd18d37) This patch doesn't work with binaries built w/ `--emit-relocs`, e.g. ``` $ echo 'int main() { return 0; }' | clang -Wl,--emit-relocs -x c - -o foo && llvm-objcopy --strip-unneeded foo llvm-objcopy: error: 'foo': not stripping symbol '__gmon_start__' because it is named in a relocation ``` git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@365712 91177308-0d34-0410-b5e6-96231b3b80d8 --- .../llvm-objcopy/ELF/no-symbol-relocation.test | 2 +- .../ELF/preserve-segment-contents-ehdr-phdrs.test | 2 +- .../llvm-objcopy/ELF/remove-multiple-sections.test | 28 ++++++++++++++++++++ .../ELF/segment-shift-section-remove.test | 30 +++++++++++++++++++++- .../ELF/segment-test-remove-section.test | 30 +++++++++++++++++++++- .../ELF/strip-unneeded-all-symbols.test | 21 --------------- tools/llvm-objcopy/ELF/ELFObjcopy.cpp | 2 +- tools/llvm-objcopy/ELF/Object.cpp | 21 --------------- tools/llvm-objcopy/ELF/Object.h | 3 --- 9 files changed, 89 insertions(+), 50 deletions(-) delete mode 100644 test/tools/llvm-objcopy/ELF/strip-unneeded-all-symbols.test diff --git a/test/tools/llvm-objcopy/ELF/no-symbol-relocation.test b/test/tools/llvm-objcopy/ELF/no-symbol-relocation.test index 64d36631856..9def536c239 100644 --- a/test/tools/llvm-objcopy/ELF/no-symbol-relocation.test +++ b/test/tools/llvm-objcopy/ELF/no-symbol-relocation.test @@ -6,7 +6,7 @@ FileHeader: Class: ELFCLASS64 Data: ELFDATA2LSB - Type: ET_REL + Type: ET_EXEC Machine: EM_X86_64 Sections: - Name: .text diff --git a/test/tools/llvm-objcopy/ELF/preserve-segment-contents-ehdr-phdrs.test b/test/tools/llvm-objcopy/ELF/preserve-segment-contents-ehdr-phdrs.test index 3352313c271..9dc63d753f6 100644 --- a/test/tools/llvm-objcopy/ELF/preserve-segment-contents-ehdr-phdrs.test +++ b/test/tools/llvm-objcopy/ELF/preserve-segment-contents-ehdr-phdrs.test @@ -13,7 +13,7 @@ # BEFORE: Type: PT_LOAD # BEFORE-NEXT: Offset: 0x240 -# AFTER: SectionHeaderCount: 3 +# AFTER: SectionHeaderCount: 5 # AFTER: Type: PT_LOAD # AFTER-NEXT: Offset: 0x0 # AFTER: Type: PT_LOAD diff --git a/test/tools/llvm-objcopy/ELF/remove-multiple-sections.test b/test/tools/llvm-objcopy/ELF/remove-multiple-sections.test index a162303ccac..1f1bc4ce191 100644 --- a/test/tools/llvm-objcopy/ELF/remove-multiple-sections.test +++ b/test/tools/llvm-objcopy/ELF/remove-multiple-sections.test @@ -87,6 +87,34 @@ Sections: # CHECK: } # CHECK: Section { # CHECK: Index: 4 +# CHECK: Name: .symtab +# CHECK: Type: SHT_SYMTAB (0x2) +# CHECK: Flags [ (0x0) +# CHECK: ] +# CHECK: Address: 0x0 +# CHECK: Offset: +# CHECK: Size: +# CHECK: Link: 5 +# CHECK: Info: 1 +# CHECK: AddressAlignment: 8 +# CHECK: EntrySize: 24 +# CHECK: } +# CHECK: Section { +# CHECK: Index: 5 +# CHECK: Name: .strtab +# CHECK: Type: SHT_STRTAB (0x3) +# CHECK: Flags [ (0x0) +# CHECK: ] +# CHECK: Address: 0x0 +# CHECK: Offset: +# CHECK: Size: +# CHECK: Link: 0 +# CHECK: Info: 0 +# CHECK: AddressAlignment: 1 +# CHECK: EntrySize: 0 +# CHECK: } +# CHECK: Section { +# CHECK: Index: 6 # CHECK: Name: .shstrtab # CHECK: Type: SHT_STRTAB (0x3) # CHECK: Flags [ (0x0) diff --git a/test/tools/llvm-objcopy/ELF/segment-shift-section-remove.test b/test/tools/llvm-objcopy/ELF/segment-shift-section-remove.test index cef783cb9b2..563a9e3f836 100644 --- a/test/tools/llvm-objcopy/ELF/segment-shift-section-remove.test +++ b/test/tools/llvm-objcopy/ELF/segment-shift-section-remove.test @@ -41,7 +41,7 @@ ProgramHeaders: Sections: - Section: .text3 -#CHECK: SectionHeaderCount: 4 +#CHECK: SectionHeaderCount: 6 # CHECK: Sections [ # CHECK-NEXT: Section { @@ -92,6 +92,34 @@ ProgramHeaders: # CHECK-NEXT: } # CHECK-NEXT: Section { # CHECK-NEXT: Index: 3 +# CHECK-NEXT: Name: .symtab +# CHECK-NEXT: Type: SHT_SYMTAB (0x2) +# CHECK-NEXT: Flags [ (0x0) +# CHECK-NEXT: ] +# CHECK-NEXT: Address: 0x0 +# CHECK-NEXT: Offset: 0x3000 +# CHECK-NEXT: Size: 24 +# CHECK-NEXT: Link: 4 +# CHECK-NEXT: Info: 1 +# CHECK-NEXT: AddressAlignment: 8 +# CHECK-NEXT: EntrySize: 24 +# CHECK-NEXT: } +# CHECK-NEXT: Section { +# CHECK-NEXT: Index: 4 +# CHECK-NEXT: Name: .strtab +# CHECK-NEXT: Type: SHT_STRTAB (0x3) +# CHECK-NEXT: Flags [ (0x0) +# CHECK-NEXT: ] +# CHECK-NEXT: Address: 0x0 +# CHECK-NEXT: Offset: 0x3018 +# CHECK-NEXT: Size: +# CHECK-NEXT: Link: 0 +# CHECK-NEXT: Info: 0 +# CHECK-NEXT: AddressAlignment: 1 +# CHECK-NEXT: EntrySize: 0 +# CHECK-NEXT: } +# CHECK-NEXT: Section { +# CHECK-NEXT: Index: 5 # CHECK-NEXT: Name: .shstrtab # CHECK-NEXT: Type: SHT_STRTAB (0x3) # CHECK-NEXT: Flags [ (0x0) diff --git a/test/tools/llvm-objcopy/ELF/segment-test-remove-section.test b/test/tools/llvm-objcopy/ELF/segment-test-remove-section.test index 60cd5f3483d..f9a5dd7811e 100644 --- a/test/tools/llvm-objcopy/ELF/segment-test-remove-section.test +++ b/test/tools/llvm-objcopy/ELF/segment-test-remove-section.test @@ -46,7 +46,7 @@ ProgramHeaders: # Make sure that when we remove a section we overwrite it with zeros # DATA: {{^[^[:blank:]]+}} 00 00 00 00 -#CHECK: SectionHeaderCount: 4 +#CHECK: SectionHeaderCount: 6 # CHECK: Sections [ # CHECK: Section { @@ -97,6 +97,34 @@ ProgramHeaders: # CHECK-NEXT: } # CHECK-NEXT: Section { # CHECK-NEXT: Index: 3 +# CHECK-NEXT: Name: .symtab +# CHECK-NEXT: Type: SHT_SYMTAB (0x2) +# CHECK-NEXT: Flags [ (0x0) +# CHECK-NEXT: ] +# CHECK-NEXT: Address: 0x0 +# CHECK-NEXT: Offset: +# CHECK-NEXT: Size: +# CHECK-NEXT: Link: 4 +# CHECK-NEXT: Info: 1 +# CHECK-NEXT: AddressAlignment: 8 +# CHECK-NEXT: EntrySize: 24 +# CHECK-NEXT: } +# CHECK-NEXT: Section { +# CHECK-NEXT: Index: 4 +# CHECK-NEXT: Name: .strtab +# CHECK-NEXT: Type: SHT_STRTAB (0x3) +# CHECK-NEXT: Flags [ (0x0) +# CHECK-NEXT: ] +# CHECK-NEXT: Address: 0x0 +# CHECK-NEXT: Offset: +# CHECK-NEXT: Size: +# CHECK-NEXT: Link: 0 +# CHECK-NEXT: Info: 0 +# CHECK-NEXT: AddressAlignment: 1 +# CHECK-NEXT: EntrySize: 0 +# CHECK-NEXT: } +# CHECK-NEXT: Section { +# CHECK-NEXT: Index: 5 # CHECK-NEXT: Name: .shstrtab # CHECK-NEXT: Type: SHT_STRTAB (0x3) # CHECK-NEXT: Flags [ (0x0) diff --git a/test/tools/llvm-objcopy/ELF/strip-unneeded-all-symbols.test b/test/tools/llvm-objcopy/ELF/strip-unneeded-all-symbols.test deleted file mode 100644 index e2fd4202115..00000000000 --- a/test/tools/llvm-objcopy/ELF/strip-unneeded-all-symbols.test +++ /dev/null @@ -1,21 +0,0 @@ -## Stripping unneeded symbols from execuatble/DSO should -## eliminate the static symbol table, because it's not used -## by the dynamic loader. - -# RUN: yaml2obj %s > %t -# RUN: cp %t %t1 -# RUN: llvm-objcopy --strip-unneeded %t %t2 -# RUN: llvm-readobj --section-headers %t2 | FileCheck %s - -!ELF -FileHeader: - Class: ELFCLASS64 - Data: ELFDATA2LSB - Type: ET_EXEC - Machine: EM_X86_64 -Symbols: - - Name: bar - - Name: foo - Binding: STB_GLOBAL - -# CHECK-NOT: .symtab diff --git a/tools/llvm-objcopy/ELF/ELFObjcopy.cpp b/tools/llvm-objcopy/ELF/ELFObjcopy.cpp index bbaac96f070..b366c6e5598 100644 --- a/tools/llvm-objcopy/ELF/ELFObjcopy.cpp +++ b/tools/llvm-objcopy/ELF/ELFObjcopy.cpp @@ -423,7 +423,7 @@ static Error updateAndRemoveSymbols(const CopyConfig &Config, Object &Obj) { if ((Config.StripUnneeded || is_contained(Config.UnneededSymbolsToRemove, Sym.Name)) && - (!Obj.isRelocatable() || isUnneededSymbol(Sym))) + isUnneededSymbol(Sym)) return true; // We want to remove undefined symbols if all references have been stripped. diff --git a/tools/llvm-objcopy/ELF/Object.cpp b/tools/llvm-objcopy/ELF/Object.cpp index 2d85b3ad36f..fa696380e17 100644 --- a/tools/llvm-objcopy/ELF/Object.cpp +++ b/tools/llvm-objcopy/ELF/Object.cpp @@ -1995,25 +1995,6 @@ template Error ELFWriter::write() { return Buf.commit(); } -static Error removeUnneededSections(Object &Obj) { - // We can remove an empty symbol table from non-relocatable objects. - // Relocatable objects typically have relocation sections whose - // sh_link field points to .symtab, so we can't remove .symtab - // even if it is empty. - if (Obj.isRelocatable() || Obj.SymbolTable == nullptr || - !Obj.SymbolTable->empty()) - return Error::success(); - - // .strtab can be used for section names. In such a case we shouldn't - // remove it. - auto *StrTab = Obj.SymbolTable->getStrTab() == Obj.SectionNames - ? nullptr - : Obj.SymbolTable->getStrTab(); - return Obj.removeSections(false, [&](const SectionBase &Sec) { - return &Sec == Obj.SymbolTable || &Sec == StrTab; - }); -} - template Error ELFWriter::finalize() { // It could happen that SectionNames has been removed and yet the user wants // a section header table output. We need to throw an error if a user tries @@ -2023,8 +2004,6 @@ template Error ELFWriter::finalize() { "cannot write section header table because " "section header string table was removed"); - if (Error E = removeUnneededSections(Obj)) - return E; Obj.sortSections(); // We need to assign indexes before we perform layout because we need to know diff --git a/tools/llvm-objcopy/ELF/Object.h b/tools/llvm-objcopy/ELF/Object.h index e56c155cfef..f3df93b9662 100644 --- a/tools/llvm-objcopy/ELF/Object.h +++ b/tools/llvm-objcopy/ELF/Object.h @@ -1051,9 +1051,6 @@ public: Segments.emplace_back(llvm::make_unique(Data)); return *Segments.back(); } - bool isRelocatable() const { - return Type != ELF::ET_DYN && Type != ELF::ET_EXEC; - } }; } // end namespace elf -- 2.11.0