Index: test/tools/llvm-objcopy/ELF/Inputs/compress-debug-sections.yaml =================================================================== --- test/tools/llvm-objcopy/ELF/Inputs/compress-debug-sections.yaml +++ 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: test/tools/llvm-objcopy/ELF/compress-debug-sections-symbols.test =================================================================== --- /dev/null +++ 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: tools/llvm-objcopy/ELF/Object.h =================================================================== --- tools/llvm-objcopy/ELF/Object.h +++ 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 &) override; static bool classof(const SectionBase *S) { return S->Type == ELF::SHT_SYMTAB; Index: tools/llvm-objcopy/ELF/Object.cpp =================================================================== --- tools/llvm-objcopy/ELF/Object.cpp +++ 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(