From f74b21f0bd6919d4388b65e9cb88009da0a67859 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20R=C3=B8nne=20Petersen?= Date: Mon, 6 Jul 2026 17:20:05 +0200 Subject: [PATCH] Elf2: fix targetLoad()/targetStore() to work with underaligned pointers --- src/link/Elf2.zig | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/link/Elf2.zig b/src/link/Elf2.zig index 42b229540ceaa41629a2ca5fc30a5738cdd28ea0..800f34fe3fbf389495e690e2c037414a2cc33098 100644 --- a/src/link/Elf2.zig +++ b/src/link/Elf2.zig @@ -4108,27 +4108,31 @@ fn targetEndian(elf: *const Elf) std.lang.Endian { }; } fn targetLoad(elf: *const Elf, ptr: anytype) @typeInfo(@TypeOf(ptr)).pointer.child { - const Child = @typeInfo(@TypeOf(ptr)).pointer.child; + const pointer_ty = @typeInfo(@TypeOf(ptr)).pointer; + const Child = pointer_ty.child; + const alignment = pointer_ty.attrs.@"align" orelse @alignOf(Child); return switch (@typeInfo(Child)) { else => @compileError(@typeName(Child)), .int => std.mem.toNative(Child, ptr.*, elf.targetEndian()), - .@"enum" => |@"enum"| @enumFromInt(elf.targetLoad(@as(*@"enum".tag_type, @ptrCast(ptr)))), + .@"enum" => |@"enum"| @enumFromInt(elf.targetLoad(@as(*align(alignment) @"enum".tag_type, @ptrCast(ptr)))), .@"struct" => |@"struct"| @bitCast( - elf.targetLoad(@as(*@"struct".backing_integer.?, @ptrCast(ptr))), + elf.targetLoad(@as(*align(alignment) @"struct".backing_integer.?, @ptrCast(ptr))), ), }; } fn targetStore(elf: *const Elf, ptr: anytype, val: @typeInfo(@TypeOf(ptr)).pointer.child) void { - const Child = @typeInfo(@TypeOf(ptr)).pointer.child; + const pointer_ty = @typeInfo(@TypeOf(ptr)).pointer; + const Child = pointer_ty.child; + const alignment = pointer_ty.attrs.@"align" orelse @alignOf(Child); return switch (@typeInfo(Child)) { else => @compileError(@typeName(Child)), .int => ptr.* = std.mem.nativeTo(Child, val, elf.targetEndian()), .@"enum" => |@"enum"| elf.targetStore( - @as(*@"enum".tag_type, @ptrCast(ptr)), + @as(*align(alignment) @"enum".tag_type, @ptrCast(ptr)), @intFromEnum(val), ), .@"struct" => |@"struct"| elf.targetStore( - @as(*@"struct".backing_integer.?, @ptrCast(ptr)), + @as(*align(alignment) @"struct".backing_integer.?, @ptrCast(ptr)), @bitCast(val), ), }; -- 2.54.0