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:
parent
f458c125da
commit
52ffd53e37
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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)
|
||||||
|
@ -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)
|
||||||
|
@ -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)
|
||||||
|
@ -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
|
|
@ -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.
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user