| ... | @@ -3247,6 +3247,31 @@ fn initHeaders( | ... | @@ -3247,6 +3247,31 @@ fn initHeaders( |
| 3247 | })); | 3247 | })); |
| 3248 | elf.nodes.appendAssumeCapacity(.shdr); | 3248 | elf.nodes.appendAssumeCapacity(.shdr); |
| 3249 | | 3249 | |
| | 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); |