From e9fd37a7493e89cbe9fba8d2c31ad915bafe816e Mon Sep 17 00:00:00 2001 From: George Rimar Date: Wed, 20 Mar 2019 13:57:47 +0000 Subject: [PATCH] [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 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@356554 91177308-0d34-0410-b5e6-96231b3b80d8 --- .../ELF/Inputs/compress-debug-sections.yaml | 6 ++++++ .../ELF/compress-debug-sections-symbols.test | 21 +++++++++++++++++++ tools/llvm-objcopy/ELF/Object.cpp | 13 ++++++------ tools/llvm-objcopy/ELF/Object.h | 2 ++ 4 files changed, 36 insertions(+), 6 deletions(-) create mode 100644 test/tools/llvm-objcopy/ELF/compress-debug-sections-symbols.test diff --git a/test/tools/llvm-objcopy/ELF/Inputs/compress-debug-sections.yaml b/test/tools/llvm-objcopy/ELF/Inputs/compress-debug-sections.yaml index 0f9f5a1aa10..a3c607cc72b 100644 --- a/test/tools/llvm-objcopy/ELF/Inputs/compress-debug-sections.yaml +++ b/test/tools/llvm-objcopy/ELF/Inputs/compress-debug-sections.yaml @@ -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 ... diff --git a/test/tools/llvm-objcopy/ELF/compress-debug-sections-symbols.test b/test/tools/llvm-objcopy/ELF/compress-debug-sections-symbols.test new file mode 100644 index 00000000000..1d6ac308d8f --- /dev/null +++ b/test/tools/llvm-objcopy/ELF/compress-debug-sections-symbols.test @@ -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 diff --git a/tools/llvm-objcopy/ELF/Object.cpp b/tools/llvm-objcopy/ELF/Object.cpp index 8b895826b3c..ccc6efa5dbd 100644 --- a/tools/llvm-objcopy/ELF/Object.cpp +++ b/tools/llvm-objcopy/ELF/Object.cpp @@ -457,6 +457,13 @@ Error SymbolTableSection::removeSymbols( return Error::success(); } +void SymbolTableSection::replaceSectionReferences( + const DenseMap &FromTo) { + for (std::unique_ptr &Sym : Symbols) + if (SectionBase *To = FromTo.lookup(Sym->DefinedIn)) + Sym->DefinedIn = To; +} + void SymbolTableSection::initialize(SectionTableRef SecTable) { Size = 0; setStrTab(SecTable.getSectionOfType( @@ -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) { diff --git a/tools/llvm-objcopy/ELF/Object.h b/tools/llvm-objcopy/ELF/Object.h index 8e72cedcf27..732ff898ed5 100644 --- a/tools/llvm-objcopy/ELF/Object.h +++ b/tools/llvm-objcopy/ELF/Object.h @@ -529,6 +529,8 @@ public: void accept(SectionVisitor &Visitor) const override; void accept(MutableSectionVisitor &Visitor) override; Error removeSymbols(function_ref ToRemove) override; + void replaceSectionReferences( + const DenseMap &FromTo) override; static bool classof(const SectionBase *S) { return S->Type == ELF::SHT_SYMTAB; -- 2.50.1