From 97ee88cbf3afc6483b8c22e5e6e9471a34d01020 Mon Sep 17 00:00:00 2001 From: Matthew Lugg Date: Thu, 24 Sep 2026 17:06:42 +0200 Subject: [PATCH] Elf2: correctly pad debug sections even when there is no ZCU --- src/link/Elf2.zig | 92 ++++++++++++++++++++++++----------------------- 1 file changed, 47 insertions(+), 45 deletions(-) diff --git a/src/link/Elf2.zig b/src/link/Elf2.zig index df3287170fc6b2247f8ac98ff4d9b6cde9954ff2..fdb5b0704402317e54207b754629ba8d408d7708 100644 --- a/src/link/Elf2.zig +++ b/src/link/Elf2.zig @@ -8301,6 +8301,53 @@ pub fn prelink(elf: *Elf, prog_node: std.Progress.Node) link.Error!void { fn prelinkInner(elf: *Elf) Error!void { const comp = elf.base.comp; const gpa = comp.gpa; + + const addr_align: Alignment = switch (elf.identClass()) { + .NONE, _ => unreachable, + .@"32" => .@"4", + .@"64" => .@"8", + }; + try elf.nodes.ensureUnusedCapacity(gpa, 7 + 5); + for ([7]Section.Index{ + elf.shndx.debug_addr, + elf.shndx.eh_frame, + elf.shndx.debug_frame, + elf.shndx.debug_info, + elf.shndx.debug_line, + elf.shndx.debug_rnglists, + elf.shndx.debug_str_offsets, + }) |debug_shndx| { + if (debug_shndx == .UNDEF) continue; + const debug_ni = debug_shndx.get(elf).ni; + const frame_format = debug_shndx.debugFrameFormat(elf); + const unit_padding_ni = elf.addNodeAssumeCapacity( + try debug_ni.addHeaderChildAfter(gpa, &elf.mf, last_header_oni: { + var last_header_oni = debug_ni.last(&elf.mf); + while (last_header_oni.unwrap()) |last_header_ni| + switch (last_header_ni.position(&elf.mf)) { + .header => break, + .footer => last_header_oni = last_header_ni.prev(&elf.mf), + .floating => unreachable, + }; + break :last_header_oni last_header_oni; + }, .{ + .alignment = if (frame_format) |_| addr_align else .@"1", + .next_moved = true, + .enable_next_moved = true, + }), + .unit_padding, + ); + var debug_nw: MappedFile.Node.Writer = undefined; + unit_padding_ni.writer(gpa, &elf.mf, &debug_nw); + defer debug_nw.deinit(); + (if (frame_format) |format| + elf.dwarf.genDebugFrameCie(&debug_nw.interface, null, format) + else + elf.dwarf.genUnitPadding(&debug_nw.interface)) catch |err| switch (err) { + error.WriteFailed => return debug_nw.err.?, + }; + } + if (comp.zcu) |_| self_hosted_codegen: { if (comp.config.use_llvm) break :self_hosted_codegen; @@ -8323,51 +8370,6 @@ fn prelinkInner(elf: *Elf) Error!void { }; elf.input_pending_index += 1; - const addr_align: Alignment = switch (elf.identClass()) { - .NONE, _ => unreachable, - .@"32" => .@"4", - .@"64" => .@"8", - }; - try elf.nodes.ensureUnusedCapacity(gpa, 7 + 5); - for ([7]Section.Index{ - elf.shndx.debug_addr, - elf.shndx.eh_frame, - elf.shndx.debug_frame, - elf.shndx.debug_info, - elf.shndx.debug_line, - elf.shndx.debug_rnglists, - elf.shndx.debug_str_offsets, - }) |debug_shndx| { - if (debug_shndx == .UNDEF) continue; - const debug_ni = debug_shndx.get(elf).ni; - const frame_format = debug_shndx.debugFrameFormat(elf); - const unit_padding_ni = elf.addNodeAssumeCapacity( - try debug_ni.addHeaderChildAfter(gpa, &elf.mf, last_header_oni: { - var last_header_oni = debug_ni.last(&elf.mf); - while (last_header_oni.unwrap()) |last_header_ni| - switch (last_header_ni.position(&elf.mf)) { - .header => break, - .footer => last_header_oni = last_header_ni.prev(&elf.mf), - .floating => unreachable, - }; - break :last_header_oni last_header_oni; - }, .{ - .alignment = if (frame_format) |_| addr_align else .@"1", - .next_moved = true, - .enable_next_moved = true, - }), - .unit_padding, - ); - var debug_nw: MappedFile.Node.Writer = undefined; - unit_padding_ni.writer(gpa, &elf.mf, &debug_nw); - defer debug_nw.deinit(); - (if (frame_format) |format| - elf.dwarf.genDebugFrameCie(&debug_nw.interface, null, format) - else - elf.dwarf.genUnitPadding(&debug_nw.interface)) catch |err| switch (err) { - error.WriteFailed => return debug_nw.err.?, - }; - } switch (elf.shndx.debug_addr) { .UNDEF => {}, else => |debug_addr_shndx| { -- 2.54.0