Index: ELF/LinkerScript.cpp =================================================================== --- ELF/LinkerScript.cpp +++ ELF/LinkerScript.cpp @@ -669,11 +669,6 @@ switchTo(Sec); - // We do not support custom layout for compressed debug sectons. - // At this point we already know their size and have compressed content. - if (Ctx->OutSec->Flags & SHF_COMPRESSED) - return; - // The Size previously denoted how many InputSections had been added to this // section, and was used for sorting SHF_LINK_ORDER sections. Reset it to // compute the actual size value. Index: ELF/OutputSections.cpp =================================================================== --- ELF/OutputSections.cpp +++ ELF/OutputSections.cpp @@ -183,15 +183,6 @@ !Name.startswith(".debug_")) return; - // Calculate the section offsets and size pre-compression. - Size = 0; - for (BaseCommand *Cmd : SectionCommands) - if (auto *ISD = dyn_cast(Cmd)) - for (InputSection *IS : ISD->Sections) { - IS->OutSecOff = alignTo(Size, IS->Alignment); - this->Size = IS->OutSecOff + IS->getSize(); - } - // Create a section header. ZDebugHeader.resize(sizeof(Elf_Chdr)); auto *Hdr = reinterpret_cast(ZDebugHeader.data()); Index: ELF/Writer.cpp =================================================================== --- ELF/Writer.cpp +++ ELF/Writer.cpp @@ -427,13 +427,14 @@ if (errorCount()) return; + Script->assignAddresses(); + // If -compressed-debug-sections is specified, we need to compress // .debug_* sections. Do it right now because it changes the size of // output sections. parallelForEach(OutputSections, [](OutputSection *Sec) { Sec->maybeCompress(); }); - Script->assignAddresses(); Script->allocateHeaders(Phdrs); // Remove empty PT_LOAD to avoid causing the dynamic linker to try to mmap a Index: test/ELF/Inputs/compress-debug.s =================================================================== --- test/ELF/Inputs/compress-debug.s +++ test/ELF/Inputs/compress-debug.s @@ -0,0 +1,5 @@ +.text +.fill 0x24 + +.section .debug_other,"",@progbits +.fill 0x42 Index: test/ELF/compress-debug-sections-reloc.s =================================================================== --- test/ELF/compress-debug-sections-reloc.s +++ test/ELF/compress-debug-sections-reloc.s @@ -0,0 +1,20 @@ +# REQUIRES: x86, zlib + +# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t.o +# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %S/Inputs/compress-debug.s -o %t2.o +# RUN: ld.lld %t2.o %t.o -o %t1 -Ttext=0x20 --compress-debug-sections=zlib +# RUN: llvm-dwarfdump %t1 -debug-str | FileCheck %s +# CHECK: 0x00000000: "D" +# CHECK: 0x00000004: "B" + +.text +a_sym: +nop + +.section .debug_str,"",@progbits +.long a_sym +.long a_debug_sym + +.section .debug_other,"",@progbits +a_debug_sym: +.long 0x88776655 Index: test/ELF/linkerscript/compress-debug-sections-custom.s =================================================================== --- test/ELF/linkerscript/compress-debug-sections-custom.s +++ test/ELF/linkerscript/compress-debug-sections-custom.s @@ -0,0 +1,26 @@ +# REQUIRES: x86, zlib + +# RUN: echo "SECTIONS { \ +# RUN: .text : { . += 0x10; *(.text) } \ +# RUN: .debug_str : { . += 0x10; *(.debug_str) } \ +# RUN: .debug_other : { . += 0x10; *(.debug_other) } \ +# RUN: }" > %t.script + +# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t.o +# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %S/../Inputs/compress-debug.s -o %t2.o +# RUN: ld.lld %t2.o %t.o -o %t1 -Ttext=0x20 --compress-debug-sections=zlib -T %t.script +# RUN: llvm-dwarfdump %t1 -debug-str | FileCheck %s +# CHECK: 0x00000010: "T" +# CHECK: 0x00000014: "R" + +.text +a_sym: +nop + +.section .debug_str,"",@progbits +.long a_sym +.long a_debug_sym + +.section .debug_other,"",@progbits +a_debug_sym: +.long 0x88776655