Index: llvm/trunk/test/tools/llvm-objcopy/ELF/Inputs/compress-debug-sections.yaml =================================================================== --- llvm/trunk/test/tools/llvm-objcopy/ELF/Inputs/compress-debug-sections.yaml +++ llvm/trunk/test/tools/llvm-objcopy/ELF/Inputs/compress-debug-sections.yaml @@ -21,6 +21,10 @@ - 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 @@ - Name: .notdebug_foo Type: STT_SECTION Section: .notdebug_foo + - Name: .Linfo_string0 + Section: .debug_bar ... Index: llvm/trunk/test/tools/llvm-objcopy/ELF/compress-debug-sections-symbols.test =================================================================== --- llvm/trunk/test/tools/llvm-objcopy/ELF/compress-debug-sections-symbols.test +++ llvm/trunk/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 Index: llvm/trunk/tools/llvm-objcopy/ELF/Object.h =================================================================== --- llvm/trunk/tools/llvm-objcopy/ELF/Object.h +++ llvm/trunk/tools/llvm-objcopy/ELF/Object.h @@ -529,6 +529,8 @@ 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; Index: llvm/trunk/tools/llvm-objcopy/ELF/Object.cpp =================================================================== --- llvm/trunk/tools/llvm-objcopy/ELF/Object.cpp +++ llvm/trunk/tools/llvm-objcopy/ELF/Object.cpp @@ -457,6 +457,13 @@ 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 @@ // 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) {