authorgravatar for mlugg@mlugg.co.ukMatthew Lugg <mlugg@mlugg.co.uk> 2026-09-24 17:06:42+02:00
committergravatar for alex@alexrp.comAlex Rønne Petersen <alex@alexrp.com> 2026-09-24 17:06:42+02:00
log97ee88cbf3afc6483b8c22e5e6e9471a34d01020
tree039b6a8934c504dd1806bd132f6717c7ac9b2e2f
parentae8532e95c36d8257245759659b40e1e0878ff05
signature Signed by SSH key SHA256:7B/LJ7bpR1eX8aCXSr4mtd5M45VMPKcx9zY8e95b5QM

Elf2: correctly pad debug sections even when there is no ZCU


1 files changed, 47 insertions(+), 45 deletions(-)

src/link/Elf2.zig+47-45
...@@ -8301,6 +8301,53 @@ pub fn prelink(elf: *Elf, prog_node: std.Progress.Node) link.Error!void {...@@ -8301,6 +8301,53 @@ pub fn prelink(elf: *Elf, prog_node: std.Progress.Node) link.Error!void {
8301fn prelinkInner(elf: *Elf) Error!void {8301fn prelinkInner(elf: *Elf) Error!void {
8302 const comp = elf.base.comp;8302 const comp = elf.base.comp;
8303 const gpa = comp.gpa;8303 const gpa = comp.gpa;
8304
8305 const addr_align: Alignment = switch (elf.identClass()) {
8306 .NONE, _ => unreachable,
8307 .@"32" => .@"4",
8308 .@"64" => .@"8",
8309 };
8310 try elf.nodes.ensureUnusedCapacity(gpa, 7 + 5);
8311 for ([7]Section.Index{
8312 elf.shndx.debug_addr,
8313 elf.shndx.eh_frame,
8314 elf.shndx.debug_frame,
8315 elf.shndx.debug_info,
8316 elf.shndx.debug_line,
8317 elf.shndx.debug_rnglists,
8318 elf.shndx.debug_str_offsets,
8319 }) |debug_shndx| {
8320 if (debug_shndx == .UNDEF) continue;
8321 const debug_ni = debug_shndx.get(elf).ni;
8322 const frame_format = debug_shndx.debugFrameFormat(elf);
8323 const unit_padding_ni = elf.addNodeAssumeCapacity(
8324 try debug_ni.addHeaderChildAfter(gpa, &elf.mf, last_header_oni: {
8325 var last_header_oni = debug_ni.last(&elf.mf);
8326 while (last_header_oni.unwrap()) |last_header_ni|
8327 switch (last_header_ni.position(&elf.mf)) {
8328 .header => break,
8329 .footer => last_header_oni = last_header_ni.prev(&elf.mf),
8330 .floating => unreachable,
8331 };
8332 break :last_header_oni last_header_oni;
8333 }, .{
8334 .alignment = if (frame_format) |_| addr_align else .@"1",
8335 .next_moved = true,
8336 .enable_next_moved = true,
8337 }),
8338 .unit_padding,
8339 );
8340 var debug_nw: MappedFile.Node.Writer = undefined;
8341 unit_padding_ni.writer(gpa, &elf.mf, &debug_nw);
8342 defer debug_nw.deinit();
8343 (if (frame_format) |format|
8344 elf.dwarf.genDebugFrameCie(&debug_nw.interface, null, format)
8345 else
8346 elf.dwarf.genUnitPadding(&debug_nw.interface)) catch |err| switch (err) {
8347 error.WriteFailed => return debug_nw.err.?,
8348 };
8349 }
8350
8304 if (comp.zcu) |_| self_hosted_codegen: {8351 if (comp.zcu) |_| self_hosted_codegen: {
8305 if (comp.config.use_llvm) break :self_hosted_codegen;8352 if (comp.config.use_llvm) break :self_hosted_codegen;
83068353
...@@ -8323,51 +8370,6 @@ fn prelinkInner(elf: *Elf) Error!void {...@@ -8323,51 +8370,6 @@ fn prelinkInner(elf: *Elf) Error!void {
8323 };8370 };
8324 elf.input_pending_index += 1;8371 elf.input_pending_index += 1;
83258372
8326 const addr_align: Alignment = switch (elf.identClass()) {
8327 .NONE, _ => unreachable,
8328 .@"32" => .@"4",
8329 .@"64" => .@"8",
8330 };
8331 try elf.nodes.ensureUnusedCapacity(gpa, 7 + 5);
8332 for ([7]Section.Index{
8333 elf.shndx.debug_addr,
8334 elf.shndx.eh_frame,
8335 elf.shndx.debug_frame,
8336 elf.shndx.debug_info,
8337 elf.shndx.debug_line,
8338 elf.shndx.debug_rnglists,
8339 elf.shndx.debug_str_offsets,
8340 }) |debug_shndx| {
8341 if (debug_shndx == .UNDEF) continue;
8342 const debug_ni = debug_shndx.get(elf).ni;
8343 const frame_format = debug_shndx.debugFrameFormat(elf);
8344 const unit_padding_ni = elf.addNodeAssumeCapacity(
8345 try debug_ni.addHeaderChildAfter(gpa, &elf.mf, last_header_oni: {
8346 var last_header_oni = debug_ni.last(&elf.mf);
8347 while (last_header_oni.unwrap()) |last_header_ni|
8348 switch (last_header_ni.position(&elf.mf)) {
8349 .header => break,
8350 .footer => last_header_oni = last_header_ni.prev(&elf.mf),
8351 .floating => unreachable,
8352 };
8353 break :last_header_oni last_header_oni;
8354 }, .{
8355 .alignment = if (frame_format) |_| addr_align else .@"1",
8356 .next_moved = true,
8357 .enable_next_moved = true,
8358 }),
8359 .unit_padding,
8360 );
8361 var debug_nw: MappedFile.Node.Writer = undefined;
8362 unit_padding_ni.writer(gpa, &elf.mf, &debug_nw);
8363 defer debug_nw.deinit();
8364 (if (frame_format) |format|
8365 elf.dwarf.genDebugFrameCie(&debug_nw.interface, null, format)
8366 else
8367 elf.dwarf.genUnitPadding(&debug_nw.interface)) catch |err| switch (err) {
8368 error.WriteFailed => return debug_nw.err.?,
8369 };
8370 }
8371 switch (elf.shndx.debug_addr) {8373 switch (elf.shndx.debug_addr) {
8372 .UNDEF => {},8374 .UNDEF => {},
8373 else => |debug_addr_shndx| {8375 else => |debug_addr_shndx| {