authorgravatar for alex@alexrp.comAlex Rønne Petersen <alex@alexrp.com> 2026-07-07 06:44:41+02:00
committergravatar for alex@alexrp.comAlex Rønne Petersen <alex@alexrp.com> 2026-07-08 18:08:25+02:00
log134c217a5bea8a7ac524d689e6d0ed34d12b4cef
tree82837d6eddf689ba425b59fc455c216fc8bc6aa8
parentc7d5569546118f6ac51cc40148bb394048abbc49
signaturebadge-check Signed by SSH key SHA256:7B/LJ7bpR1eX8aCXSr4mtd5M45VMPKcx9zY8e95b5QM

Elf2: align program headers to the ABI page size


1 files changed, 28 insertions(+), 3 deletions(-)

src/link/Elf2.zig+28-3
...@@ -3247,6 +3247,31 @@ fn initHeaders(...@@ -3247,6 +3247,31 @@ fn initHeaders(
3247 }));3247 }));
3248 elf.nodes.appendAssumeCapacity(.shdr);3248 elf.nodes.appendAssumeCapacity(.shdr);
32493249
3250 const page_align: std.mem.Alignment = .fromByteUnits(switch (machine) {
3251 .BPF,
3252 .SPARCV9,
3253 => 0x100000,
3254 .AARCH64,
3255 .AMDGPU,
3256 .QDSP6,
3257 .MIPS,
3258 .PPC,
3259 .PPC64,
3260 .SPARC,
3261 .SPARC32PLUS,
3262 => 0x10000,
3263 .LOONGARCH,
3264 => 0x4000,
3265 .ARC_COMPACT2,
3266 .@"68K",
3267 => 0x2000,
3268 .MSP430,
3269 => 0x4,
3270 .AVR,
3271 => 0x1,
3272 else => 0x1000,
3273 });
3274
3250 var ph_vaddr: u32 = if (@"type" != .REL) ph_vaddr: {3275 var ph_vaddr: u32 = if (@"type" != .REL) ph_vaddr: {
3251 assert(elf.ni.rodata == try elf.mf.addLastChildNode(gpa, elf.ni.file, .{3276 assert(elf.ni.rodata == try elf.mf.addLastChildNode(gpa, elf.ni.file, .{
3252 .alignment = elf.mf.flags.block_size,3277 .alignment = elf.mf.flags.block_size,
...@@ -3351,7 +3376,7 @@ fn initHeaders(...@@ -3351,7 +3376,7 @@ fn initHeaders(
3351 .filesz = @intCast(rodata_size),3376 .filesz = @intCast(rodata_size),
3352 .memsz = @intCast(rodata_size),3377 .memsz = @intCast(rodata_size),
3353 .flags = .{ .R = true },3378 .flags = .{ .R = true },
3354 .@"align" = @intCast(elf.ni.rodata.alignment(&elf.mf).toByteUnits()),3379 .@"align" = @intCast(elf.ni.rodata.alignment(&elf.mf).max(page_align).toByteUnits()),
3355 };3380 };
3356 if (target_endian != native_endian) std.mem.byteSwapAllFields(ElfN.Phdr, ph_rodata);3381 if (target_endian != native_endian) std.mem.byteSwapAllFields(ElfN.Phdr, ph_rodata);
3357 ph_vaddr += @intCast(rodata_size);3382 ph_vaddr += @intCast(rodata_size);
...@@ -3366,7 +3391,7 @@ fn initHeaders(...@@ -3366,7 +3391,7 @@ fn initHeaders(
3366 .filesz = @intCast(text_size),3391 .filesz = @intCast(text_size),
3367 .memsz = @intCast(text_size),3392 .memsz = @intCast(text_size),
3368 .flags = .{ .R = true, .X = true },3393 .flags = .{ .R = true, .X = true },
3369 .@"align" = @intCast(elf.ni.text.alignment(&elf.mf).toByteUnits()),3394 .@"align" = @intCast(elf.ni.text.alignment(&elf.mf).max(page_align).toByteUnits()),
3370 };3395 };
3371 if (target_endian != native_endian) std.mem.byteSwapAllFields(ElfN.Phdr, ph_text);3396 if (target_endian != native_endian) std.mem.byteSwapAllFields(ElfN.Phdr, ph_text);
3372 ph_vaddr += @intCast(text_size);3397 ph_vaddr += @intCast(text_size);
...@@ -3381,7 +3406,7 @@ fn initHeaders(...@@ -3381,7 +3406,7 @@ fn initHeaders(
3381 .filesz = @intCast(data_size),3406 .filesz = @intCast(data_size),
3382 .memsz = @intCast(data_size),3407 .memsz = @intCast(data_size),
3383 .flags = .{ .R = true, .W = true },3408 .flags = .{ .R = true, .W = true },
3384 .@"align" = @intCast(elf.ni.data.alignment(&elf.mf).toByteUnits()),3409 .@"align" = @intCast(elf.ni.data.alignment(&elf.mf).max(page_align).toByteUnits()),
3385 };3410 };
3386 if (target_endian != native_endian) std.mem.byteSwapAllFields(ElfN.Phdr, ph_data);3411 if (target_endian != native_endian) std.mem.byteSwapAllFields(ElfN.Phdr, ph_data);
3387 ph_vaddr += @intCast(data_size);3412 ph_vaddr += @intCast(data_size);