[llvm] r365193 - [llvm-objcopy] Allow strip symtab from executables and DSOs
Eugene Leviant via llvm-commits
llvm-commits at lists.llvm.org
Fri Jul 5 05:10:44 PDT 2019
Author: evgeny777
Date: Fri Jul 5 05:10:44 2019
New Revision: 365193
URL: http://llvm.org/viewvc/llvm-project?rev=365193&view=rev
Log:
[llvm-objcopy] Allow strip symtab from executables and DSOs
Differential revision: https://reviews.llvm.org/D61672
Added:
llvm/trunk/test/tools/llvm-objcopy/ELF/strip-unneeded-all-symbols.test
Modified:
llvm/trunk/test/tools/llvm-objcopy/ELF/no-symbol-relocation.test
llvm/trunk/test/tools/llvm-objcopy/ELF/preserve-segment-contents-ehdr-phdrs.test
llvm/trunk/test/tools/llvm-objcopy/ELF/remove-multiple-sections.test
llvm/trunk/test/tools/llvm-objcopy/ELF/segment-shift-section-remove.test
llvm/trunk/test/tools/llvm-objcopy/ELF/segment-test-remove-section.test
llvm/trunk/tools/llvm-objcopy/ELF/ELFObjcopy.cpp
llvm/trunk/tools/llvm-objcopy/ELF/Object.cpp
llvm/trunk/tools/llvm-objcopy/ELF/Object.h
Modified: llvm/trunk/test/tools/llvm-objcopy/ELF/no-symbol-relocation.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-objcopy/ELF/no-symbol-relocation.test?rev=365193&r1=365192&r2=365193&view=diff
==============================================================================
--- llvm/trunk/test/tools/llvm-objcopy/ELF/no-symbol-relocation.test (original)
+++ llvm/trunk/test/tools/llvm-objcopy/ELF/no-symbol-relocation.test Fri Jul 5 05:10:44 2019
@@ -6,7 +6,7 @@
FileHeader:
Class: ELFCLASS64
Data: ELFDATA2LSB
- Type: ET_EXEC
+ Type: ET_REL
Machine: EM_X86_64
Sections:
- Name: .text
Modified: llvm/trunk/test/tools/llvm-objcopy/ELF/preserve-segment-contents-ehdr-phdrs.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-objcopy/ELF/preserve-segment-contents-ehdr-phdrs.test?rev=365193&r1=365192&r2=365193&view=diff
==============================================================================
--- llvm/trunk/test/tools/llvm-objcopy/ELF/preserve-segment-contents-ehdr-phdrs.test (original)
+++ llvm/trunk/test/tools/llvm-objcopy/ELF/preserve-segment-contents-ehdr-phdrs.test Fri Jul 5 05:10:44 2019
@@ -13,7 +13,7 @@
# BEFORE: Type: PT_LOAD
# BEFORE-NEXT: Offset: 0x240
-# AFTER: SectionHeaderCount: 5
+# AFTER: SectionHeaderCount: 3
# AFTER: Type: PT_LOAD
# AFTER-NEXT: Offset: 0x0
# AFTER: Type: PT_LOAD
Modified: llvm/trunk/test/tools/llvm-objcopy/ELF/remove-multiple-sections.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-objcopy/ELF/remove-multiple-sections.test?rev=365193&r1=365192&r2=365193&view=diff
==============================================================================
--- llvm/trunk/test/tools/llvm-objcopy/ELF/remove-multiple-sections.test (original)
+++ llvm/trunk/test/tools/llvm-objcopy/ELF/remove-multiple-sections.test Fri Jul 5 05:10:44 2019
@@ -87,34 +87,6 @@ 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)
Modified: llvm/trunk/test/tools/llvm-objcopy/ELF/segment-shift-section-remove.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-objcopy/ELF/segment-shift-section-remove.test?rev=365193&r1=365192&r2=365193&view=diff
==============================================================================
--- llvm/trunk/test/tools/llvm-objcopy/ELF/segment-shift-section-remove.test (original)
+++ llvm/trunk/test/tools/llvm-objcopy/ELF/segment-shift-section-remove.test Fri Jul 5 05:10:44 2019
@@ -41,7 +41,7 @@ ProgramHeaders:
Sections:
- Section: .text3
-#CHECK: SectionHeaderCount: 6
+#CHECK: SectionHeaderCount: 4
# CHECK: Sections [
# CHECK-NEXT: Section {
@@ -92,34 +92,6 @@ 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)
Modified: llvm/trunk/test/tools/llvm-objcopy/ELF/segment-test-remove-section.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-objcopy/ELF/segment-test-remove-section.test?rev=365193&r1=365192&r2=365193&view=diff
==============================================================================
--- llvm/trunk/test/tools/llvm-objcopy/ELF/segment-test-remove-section.test (original)
+++ llvm/trunk/test/tools/llvm-objcopy/ELF/segment-test-remove-section.test Fri Jul 5 05:10:44 2019
@@ -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: 6
+#CHECK: SectionHeaderCount: 4
# CHECK: Sections [
# CHECK: Section {
@@ -97,34 +97,6 @@ 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)
Added: llvm/trunk/test/tools/llvm-objcopy/ELF/strip-unneeded-all-symbols.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-objcopy/ELF/strip-unneeded-all-symbols.test?rev=365193&view=auto
==============================================================================
--- llvm/trunk/test/tools/llvm-objcopy/ELF/strip-unneeded-all-symbols.test (added)
+++ llvm/trunk/test/tools/llvm-objcopy/ELF/strip-unneeded-all-symbols.test Fri Jul 5 05:10:44 2019
@@ -0,0 +1,21 @@
+## 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
Modified: llvm/trunk/tools/llvm-objcopy/ELF/ELFObjcopy.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-objcopy/ELF/ELFObjcopy.cpp?rev=365193&r1=365192&r2=365193&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-objcopy/ELF/ELFObjcopy.cpp (original)
+++ llvm/trunk/tools/llvm-objcopy/ELF/ELFObjcopy.cpp Fri Jul 5 05:10:44 2019
@@ -423,7 +423,7 @@ static Error updateAndRemoveSymbols(cons
if ((Config.StripUnneeded ||
is_contained(Config.UnneededSymbolsToRemove, Sym.Name)) &&
- isUnneededSymbol(Sym))
+ (!Obj.isRelocatable() || isUnneededSymbol(Sym)))
return true;
// We want to remove undefined symbols if all references have been stripped.
Modified: llvm/trunk/tools/llvm-objcopy/ELF/Object.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-objcopy/ELF/Object.cpp?rev=365193&r1=365192&r2=365193&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-objcopy/ELF/Object.cpp (original)
+++ llvm/trunk/tools/llvm-objcopy/ELF/Object.cpp Fri Jul 5 05:10:44 2019
@@ -1995,6 +1995,25 @@ template <class ELFT> Error ELFWriter<EL
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 <class ELFT> Error ELFWriter<ELFT>::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
@@ -2004,6 +2023,8 @@ template <class ELFT> Error ELFWriter<EL
"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
Modified: llvm/trunk/tools/llvm-objcopy/ELF/Object.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-objcopy/ELF/Object.h?rev=365193&r1=365192&r2=365193&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-objcopy/ELF/Object.h (original)
+++ llvm/trunk/tools/llvm-objcopy/ELF/Object.h Fri Jul 5 05:10:44 2019
@@ -1051,6 +1051,9 @@ public:
Segments.emplace_back(llvm::make_unique<Segment>(Data));
return *Segments.back();
}
+ bool isRelocatable() const {
+ return Type != ELF::ET_DYN && Type != ELF::ET_EXEC;
+ }
};
} // end namespace elf
More information about the llvm-commits
mailing list