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(
32473247 }));
32483248 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
32503275 var ph_vaddr: u32 = if (@"type" != .REL) ph_vaddr: {
32513276 assert(elf.ni.rodata == try elf.mf.addLastChildNode(gpa, elf.ni.file, .{
32523277 .alignment = elf.mf.flags.block_size,
......@@ -3351,7 +3376,7 @@ fn initHeaders(
33513376 .filesz = @intCast(rodata_size),
33523377 .memsz = @intCast(rodata_size),
33533378 .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()),
33553380 };
33563381 if (target_endian != native_endian) std.mem.byteSwapAllFields(ElfN.Phdr, ph_rodata);
33573382 ph_vaddr += @intCast(rodata_size);
......@@ -3366,7 +3391,7 @@ fn initHeaders(
33663391 .filesz = @intCast(text_size),
33673392 .memsz = @intCast(text_size),
33683393 .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()),
33703395 };
33713396 if (target_endian != native_endian) std.mem.byteSwapAllFields(ElfN.Phdr, ph_text);
33723397 ph_vaddr += @intCast(text_size);
......@@ -3381,7 +3406,7 @@ fn initHeaders(
33813406 .filesz = @intCast(data_size),
33823407 .memsz = @intCast(data_size),
33833408 .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()),
33853410 };
33863411 if (target_endian != native_endian) std.mem.byteSwapAllFields(ElfN.Phdr, ph_data);
33873412 ph_vaddr += @intCast(data_size);