From c14bc1bbe09069a2371085e3a1275e30f4665c6b Mon Sep 17 00:00:00 2001 From: kcbanner Date: Fri, 5 Jun 2026 01:55:37 -0400 Subject: [PATCH] Coff: fixup alignment of second linker member accessors test/link: update emit-static-lib test to check array relocs --- src/link/Coff.zig | 12 +++++------- test/link.zig | 9 ++++++--- test/link/snapshots/emit-static-lib.dmp | 1 + 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/src/link/Coff.zig b/src/link/Coff.zig index 23a2326899993bc8c61e4d1f9cf211781909698b..5a62f3e016ec28e37cbb65073bac2f7cdcdb5576 100644 --- a/src/link/Coff.zig +++ b/src/link/Coff.zig @@ -2404,19 +2404,19 @@ pub fn firstLinkerMemberOffsetsSlice(coff: *Coff) []u32 { return @ptrCast(@alignCast(Node.known.first_linker_member.slice(&coff.mf)[@sizeOf(u32)..][0 .. len * @sizeOf(u32)])); } -pub fn secondLinkerMemberNumMembersPtr(coff: *Coff) *u32 { +pub fn secondLinkerMemberNumMembersPtr(coff: *Coff) *align(2) u32 { assert(coff.isArchive()); return @ptrCast(@alignCast(Node.known.second_linker_member.slice(&coff.mf))); } -pub fn secondLinkerMemberOffsetsSlice(coff: *Coff) []u32 { +pub fn secondLinkerMemberOffsetsSlice(coff: *Coff) []align(2) u32 { const num_members = coff.targetLoad(coff.secondLinkerMemberNumMembersPtr()); return @ptrCast(@alignCast( Node.known.second_linker_member.slice(&coff.mf)[@sizeOf(u32)..][0 .. num_members * @sizeOf(u32)], )); } -pub fn secondLinkerMemberNumSymbolsPtr(coff: *Coff) *u32 { +pub fn secondLinkerMemberNumSymbolsPtr(coff: *Coff) *align(2) u32 { const num_members = coff.targetLoad(coff.secondLinkerMemberNumMembersPtr()); return @ptrCast(@alignCast( Node.known.second_linker_member.slice(&coff.mf)[(1 + num_members) * @sizeOf(u32) ..], @@ -2970,9 +2970,7 @@ fn ensureMemberSymbol(coff: *Coff, mi: Member.Index, name: String) !void { try coff.lib_string_table.append(gpa, name); const slice = Node.known.second_linker_member.slice(&coff.mf); - const num_symbols_ptr: *u32 = @ptrCast(@alignCast(slice[@sizeOf(u32) + num_members * @sizeOf(u32) ..])); - coff.targetStore(num_symbols_ptr, @intFromEnum(mfli) + 1); - + coff.targetStore(coff.secondLinkerMemberNumSymbolsPtr(), @intFromEnum(mfli) + 1); if (!needs_sort) { @memmove(slice[new_header_size..][0..coff.lib_string_len], slice[old_header_size..][0..coff.lib_string_len]); @memcpy(slice[new_header_size + coff.lib_string_len ..][0..name_slice.len], name_slice[0..name_slice.len]); @@ -4670,7 +4668,7 @@ fn loadObject( if (include_section) { assert(coff.getNode(symbol.si.get(coff).ni) == .input_section); - symbol.si.get(coff).extra = .{ .isli = @enumFromInt(coff.input_symbols.items.len) }; + symbol.si.get(coff).setExtra(.{ .isli = @enumFromInt(coff.input_symbols.items.len) }); coff.input_symbols.addOneAssumeCapacity().* = .{ .si = symbol.si, .name = symbol.name, diff --git a/test/link.zig b/test/link.zig index a414f3847c4447abcb7f08b28231c8615a396319..1d0a799e4f46e4d3f00aa6639667d830b1454b69 100644 --- a/test/link.zig +++ b/test/link.zig @@ -44,9 +44,10 @@ pub fn addCases(ctx: *LinkContext) void { .name_target = false, .zig_source_bytes = \\fn weakFoo() callconv(.c) usize { - \\ return 0xaabbccdd; + \\ return 0xaabbccddaabbccdd; \\} - \\export var strong_foo: usize = 0x11223344; + \\export var array_foo: [2]u16 = .{ 0xffff, 0xabcd }; + \\export var strong_foo: usize = 0x1122334411223344; \\comptime { \\ @export(&weakFoo, .{ .name = "weakFoo", .linkage = .weak }); \\ @export(&strong_foo, .{ .name = "strong_foo_alias", .linkage = .strong }); @@ -75,11 +76,13 @@ pub fn addCases(ctx: *LinkContext) void { .zig_source_bytes = \\extern fn fooBar() c_uint; \\extern fn weakFoo() usize; + \\extern var array_foo: [2]u16; \\extern var strong_foo: usize; \\extern var strong_foo_alias: usize; \\pub fn main() !u8 { - \\ return @intFromBool(0xcd003368 != fooBar() + + \\ return @intFromBool(0xcd003365cd00df35 != fooBar() + \\ weakFoo() + + \\ array_foo[1] + \\ strong_foo + \\ strong_foo_alias); \\} diff --git a/test/link/snapshots/emit-static-lib.dmp b/test/link/snapshots/emit-static-lib.dmp index 7f187063d02f8bb44c5574b0bf94ade24576c525..41932df9785ea10382d73473f93e8e4b16a3fe72 100644 --- a/test/link/snapshots/emit-static-lib.dmp +++ b/test/link/snapshots/emit-static-lib.dmp @@ -5,5 +5,6 @@ xxxx 00000000 2 NULL EXTERNAL | foo1 xxxx 00000004 2 NULL EXTERNAL | foo2 lib.lib(this_is_a_long_name.obj): COFF object xxxx 00000000 4 NULL() EXTERNAL | weakFoo +xxxx 00000010 2 NULL EXTERNAL | array_foo xxxx 00000000 2 NULL EXTERNAL | strong_foo_alias xxxx 00000000 2 NULL EXTERNAL | strong_foo -- 2.54.0