summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJordan Rupprecht <rupprecht@google.com>2019-07-10 23:32:44 +0000
committerJordan Rupprecht <rupprecht@google.com>2019-07-10 23:32:44 +0000
commit77d3590a87ba4a2ef621a1aab6a378639e1cd926 (patch)
treeec38548229e9feefcf6c35fae39154dcc619d6e8
parent138328e45cdfaff58fdbf643580563f9775e5d25 (diff)
downloadbcm5719-llvm-77d3590a87ba4a2ef621a1aab6a378639e1cd926.tar.gz
bcm5719-llvm-77d3590a87ba4a2ef621a1aab6a378639e1cd926.zip
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 ``` llvm-svn: 365712
-rw-r--r--llvm/test/tools/llvm-objcopy/ELF/no-symbol-relocation.test2
-rw-r--r--llvm/test/tools/llvm-objcopy/ELF/preserve-segment-contents-ehdr-phdrs.test2
-rw-r--r--llvm/test/tools/llvm-objcopy/ELF/remove-multiple-sections.test28
-rw-r--r--llvm/test/tools/llvm-objcopy/ELF/segment-shift-section-remove.test30
-rw-r--r--llvm/test/tools/llvm-objcopy/ELF/segment-test-remove-section.test30
-rw-r--r--llvm/test/tools/llvm-objcopy/ELF/strip-unneeded-all-symbols.test21
-rw-r--r--llvm/tools/llvm-objcopy/ELF/ELFObjcopy.cpp2
-rw-r--r--llvm/tools/llvm-objcopy/ELF/Object.cpp21
-rw-r--r--llvm/tools/llvm-objcopy/ELF/Object.h3
9 files changed, 89 insertions, 50 deletions
diff --git a/llvm/test/tools/llvm-objcopy/ELF/no-symbol-relocation.test b/llvm/test/tools/llvm-objcopy/ELF/no-symbol-relocation.test
index 64d36631856..9def536c239 100644
--- a/llvm/test/tools/llvm-objcopy/ELF/no-symbol-relocation.test
+++ b/llvm/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/llvm/test/tools/llvm-objcopy/ELF/preserve-segment-contents-ehdr-phdrs.test b/llvm/test/tools/llvm-objcopy/ELF/preserve-segment-contents-ehdr-phdrs.test
index 3352313c271..9dc63d753f6 100644
--- a/llvm/test/tools/llvm-objcopy/ELF/preserve-segment-contents-ehdr-phdrs.test
+++ b/llvm/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/llvm/test/tools/llvm-objcopy/ELF/remove-multiple-sections.test b/llvm/test/tools/llvm-objcopy/ELF/remove-multiple-sections.test
index a162303ccac..1f1bc4ce191 100644
--- a/llvm/test/tools/llvm-objcopy/ELF/remove-multiple-sections.test
+++ b/llvm/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/llvm/test/tools/llvm-objcopy/ELF/segment-shift-section-remove.test b/llvm/test/tools/llvm-objcopy/ELF/segment-shift-section-remove.test
index cef783cb9b2..563a9e3f836 100644
--- a/llvm/test/tools/llvm-objcopy/ELF/segment-shift-section-remove.test
+++ b/llvm/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/llvm/test/tools/llvm-objcopy/ELF/segment-test-remove-section.test b/llvm/test/tools/llvm-objcopy/ELF/segment-test-remove-section.test
index 60cd5f3483d..f9a5dd7811e 100644
--- a/llvm/test/tools/llvm-objcopy/ELF/segment-test-remove-section.test
+++ b/llvm/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/llvm/test/tools/llvm-objcopy/ELF/strip-unneeded-all-symbols.test b/llvm/test/tools/llvm-objcopy/ELF/strip-unneeded-all-symbols.test
deleted file mode 100644
index e2fd4202115..00000000000
--- a/llvm/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/llvm/tools/llvm-objcopy/ELF/ELFObjcopy.cpp b/llvm/tools/llvm-objcopy/ELF/ELFObjcopy.cpp
index bbaac96f070..b366c6e5598 100644
--- a/llvm/tools/llvm-objcopy/ELF/ELFObjcopy.cpp
+++ b/llvm/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/llvm/tools/llvm-objcopy/ELF/Object.cpp b/llvm/tools/llvm-objcopy/ELF/Object.cpp
index 2d85b3ad36f..fa696380e17 100644
--- a/llvm/tools/llvm-objcopy/ELF/Object.cpp
+++ b/llvm/tools/llvm-objcopy/ELF/Object.cpp
@@ -1995,25 +1995,6 @@ template <class ELFT> Error ELFWriter<ELFT>::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 <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
@@ -2023,8 +2004,6 @@ template <class ELFT> Error ELFWriter<ELFT>::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/llvm/tools/llvm-objcopy/ELF/Object.h b/llvm/tools/llvm-objcopy/ELF/Object.h
index e56c155cfef..f3df93b9662 100644
--- a/llvm/tools/llvm-objcopy/ELF/Object.h
+++ b/llvm/tools/llvm-objcopy/ELF/Object.h
@@ -1051,9 +1051,6 @@ 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
OpenPOWER on IntegriCloud