1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-24 03:33:20 +01:00

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
This commit is contained in:
Jordan Rupprecht 2019-07-10 23:32:44 +00:00
parent f458c125da
commit 52ffd53e37
9 changed files with 89 additions and 50 deletions

View File

@ -6,7 +6,7 @@
FileHeader: FileHeader:
Class: ELFCLASS64 Class: ELFCLASS64
Data: ELFDATA2LSB Data: ELFDATA2LSB
Type: ET_REL Type: ET_EXEC
Machine: EM_X86_64 Machine: EM_X86_64
Sections: Sections:
- Name: .text - Name: .text

View File

@ -13,7 +13,7 @@
# BEFORE: Type: PT_LOAD # BEFORE: Type: PT_LOAD
# BEFORE-NEXT: Offset: 0x240 # BEFORE-NEXT: Offset: 0x240
# AFTER: SectionHeaderCount: 3 # AFTER: SectionHeaderCount: 5
# AFTER: Type: PT_LOAD # AFTER: Type: PT_LOAD
# AFTER-NEXT: Offset: 0x0 # AFTER-NEXT: Offset: 0x0
# AFTER: Type: PT_LOAD # AFTER: Type: PT_LOAD

View File

@ -87,6 +87,34 @@ Sections:
# CHECK: } # CHECK: }
# CHECK: Section { # CHECK: Section {
# CHECK: Index: 4 # 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: Name: .shstrtab
# CHECK: Type: SHT_STRTAB (0x3) # CHECK: Type: SHT_STRTAB (0x3)
# CHECK: Flags [ (0x0) # CHECK: Flags [ (0x0)

View File

@ -41,7 +41,7 @@ ProgramHeaders:
Sections: Sections:
- Section: .text3 - Section: .text3
#CHECK: SectionHeaderCount: 4 #CHECK: SectionHeaderCount: 6
# CHECK: Sections [ # CHECK: Sections [
# CHECK-NEXT: Section { # CHECK-NEXT: Section {
@ -92,6 +92,34 @@ ProgramHeaders:
# CHECK-NEXT: } # CHECK-NEXT: }
# CHECK-NEXT: Section { # CHECK-NEXT: Section {
# CHECK-NEXT: Index: 3 # 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: Name: .shstrtab
# CHECK-NEXT: Type: SHT_STRTAB (0x3) # CHECK-NEXT: Type: SHT_STRTAB (0x3)
# CHECK-NEXT: Flags [ (0x0) # CHECK-NEXT: Flags [ (0x0)

View File

@ -46,7 +46,7 @@ ProgramHeaders:
# Make sure that when we remove a section we overwrite it with zeros # Make sure that when we remove a section we overwrite it with zeros
# DATA: {{^[^[:blank:]]+}} 00 00 00 00 # DATA: {{^[^[:blank:]]+}} 00 00 00 00
#CHECK: SectionHeaderCount: 4 #CHECK: SectionHeaderCount: 6
# CHECK: Sections [ # CHECK: Sections [
# CHECK: Section { # CHECK: Section {
@ -97,6 +97,34 @@ ProgramHeaders:
# CHECK-NEXT: } # CHECK-NEXT: }
# CHECK-NEXT: Section { # CHECK-NEXT: Section {
# CHECK-NEXT: Index: 3 # 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: Name: .shstrtab
# CHECK-NEXT: Type: SHT_STRTAB (0x3) # CHECK-NEXT: Type: SHT_STRTAB (0x3)
# CHECK-NEXT: Flags [ (0x0) # CHECK-NEXT: Flags [ (0x0)

View File

@ -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

View File

@ -423,7 +423,7 @@ static Error updateAndRemoveSymbols(const CopyConfig &Config, Object &Obj) {
if ((Config.StripUnneeded || if ((Config.StripUnneeded ||
is_contained(Config.UnneededSymbolsToRemove, Sym.Name)) && is_contained(Config.UnneededSymbolsToRemove, Sym.Name)) &&
(!Obj.isRelocatable() || isUnneededSymbol(Sym))) isUnneededSymbol(Sym))
return true; return true;
// We want to remove undefined symbols if all references have been stripped. // We want to remove undefined symbols if all references have been stripped.

View File

@ -1995,25 +1995,6 @@ template <class ELFT> Error ELFWriter<ELFT>::write() {
return Buf.commit(); 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() { template <class ELFT> Error ELFWriter<ELFT>::finalize() {
// It could happen that SectionNames has been removed and yet the user wants // 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 // 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 " "cannot write section header table because "
"section header string table was removed"); "section header string table was removed");
if (Error E = removeUnneededSections(Obj))
return E;
Obj.sortSections(); Obj.sortSections();
// We need to assign indexes before we perform layout because we need to know // We need to assign indexes before we perform layout because we need to know

View File

@ -1051,9 +1051,6 @@ public:
Segments.emplace_back(llvm::make_unique<Segment>(Data)); Segments.emplace_back(llvm::make_unique<Segment>(Data));
return *Segments.back(); return *Segments.back();
} }
bool isRelocatable() const {
return Type != ELF::ET_DYN && Type != ELF::ET_EXEC;
}
}; };
} // end namespace elf } // end namespace elf