forked from OSchip/llvm-project
[llvm-objcopy] - Use replaceSectionReferences to update the sections for symbols in symbol table.
If the compression was used and we had a symbol not involved in relocation, we never updated its section and it was silently removed from the output. Differential revision: https://reviews.llvm.org/D59542 llvm-svn: 356554
This commit is contained in:
parent
2b70dcd2ef
commit
0373bedb41
|
@ -21,6 +21,10 @@ Sections:
|
|||
- Offset: 0x2
|
||||
Symbol: .notdebug_foo
|
||||
Type: R_X86_64_32
|
||||
## This section should not be involved in relocations.
|
||||
- Name: .debug_bar
|
||||
Type: SHT_PROGBITS
|
||||
Content: 0000000000000000
|
||||
Symbols:
|
||||
Global:
|
||||
- Name: .debug_foo
|
||||
|
@ -29,4 +33,6 @@ Symbols:
|
|||
- Name: .notdebug_foo
|
||||
Type: STT_SECTION
|
||||
Section: .notdebug_foo
|
||||
- Name: .Linfo_string0
|
||||
Section: .debug_bar
|
||||
...
|
||||
|
|
|
@ -0,0 +1,21 @@
|
|||
# REQUIRES: zlib
|
||||
|
||||
# RUN: yaml2obj %p/Inputs/compress-debug-sections.yaml -o %t.o
|
||||
|
||||
## Test that after the compression is done we do not remove the symbol
|
||||
## and it is placed into the right section.
|
||||
|
||||
# RUN: llvm-objcopy --compress-debug-sections %t.o %t-compressed1.o
|
||||
# RUN: llvm-readobj -symbols %t-compressed1.o | FileCheck %s --check-prefixes=CHECK,ZLIB
|
||||
|
||||
# RUN: llvm-objcopy --compress-debug-sections=zlib-gnu %t.o %t-compressed2.o
|
||||
# RUN: llvm-readobj -symbols %t-compressed2.o | FileCheck %s --check-prefixes=CHECK,ZLIBGNU
|
||||
|
||||
# CHECK: Name: .Linfo_string0
|
||||
# CHECK-NEXT: Value: 0x0
|
||||
# CHECK-NEXT: Size: 0
|
||||
# CHECK-NEXT: Binding: Global
|
||||
# CHECK-NEXT: Type: None
|
||||
# CHECK-NEXT: Other: 0
|
||||
# ZLIB-NEXT: Section: .debug_bar
|
||||
# ZLIBGNU-NEXT: Section: .zdebug_bar
|
|
@ -457,6 +457,13 @@ Error SymbolTableSection::removeSymbols(
|
|||
return Error::success();
|
||||
}
|
||||
|
||||
void SymbolTableSection::replaceSectionReferences(
|
||||
const DenseMap<SectionBase *, SectionBase *> &FromTo) {
|
||||
for (std::unique_ptr<Symbol> &Sym : Symbols)
|
||||
if (SectionBase *To = FromTo.lookup(Sym->DefinedIn))
|
||||
Sym->DefinedIn = To;
|
||||
}
|
||||
|
||||
void SymbolTableSection::initialize(SectionTableRef SecTable) {
|
||||
Size = 0;
|
||||
setStrTab(SecTable.getSectionOfType<StringTableSection>(
|
||||
|
@ -638,12 +645,6 @@ void RelocationSection::replaceSectionReferences(
|
|||
// Update the target section if it was replaced.
|
||||
if (SectionBase *To = FromTo.lookup(SecToApplyRel))
|
||||
SecToApplyRel = To;
|
||||
|
||||
// Change the sections where symbols are defined in if their
|
||||
// original sections were replaced.
|
||||
for (const Relocation &R : Relocations)
|
||||
if (SectionBase *To = FromTo.lookup(R.RelocSymbol->DefinedIn))
|
||||
R.RelocSymbol->DefinedIn = To;
|
||||
}
|
||||
|
||||
void SectionWriter::visit(const DynamicRelocationSection &Sec) {
|
||||
|
|
|
@ -529,6 +529,8 @@ public:
|
|||
void accept(SectionVisitor &Visitor) const override;
|
||||
void accept(MutableSectionVisitor &Visitor) override;
|
||||
Error removeSymbols(function_ref<bool(const Symbol &)> ToRemove) override;
|
||||
void replaceSectionReferences(
|
||||
const DenseMap<SectionBase *, SectionBase *> &FromTo) override;
|
||||
|
||||
static bool classof(const SectionBase *S) {
|
||||
return S->Type == ELF::SHT_SYMTAB;
|
||||
|
|
Loading…
Reference in New Issue