authorgravatar for kcbanner@gmail.comCasey Banner <kcbanner@gmail.com> 2026-06-05 01:55:37-04:00
committergravatar for kcbanner@gmail.comCasey Banner <kcbanner@gmail.com> 2026-06-23 00:27:16-04:00
logc14bc1bbe09069a2371085e3a1275e30f4665c6b
tree7d5524f15a45dc0efc4681096748356235cd4a61
parente20860765e926dfab43492c3e0fbbe09f08818f6

Coff: fixup alignment of second linker member accessors

test/link: update emit-static-lib test to check array relocs

3 files changed, 12 insertions(+), 10 deletions(-)

src/link/Coff.zig+5-7
...@@ -2404,19 +2404,19 @@ pub fn firstLinkerMemberOffsetsSlice(coff: *Coff) []u32 {...@@ -2404,19 +2404,19 @@ pub fn firstLinkerMemberOffsetsSlice(coff: *Coff) []u32 {
2404 return @ptrCast(@alignCast(Node.known.first_linker_member.slice(&coff.mf)[@sizeOf(u32)..][0 .. len * @sizeOf(u32)]));2404 return @ptrCast(@alignCast(Node.known.first_linker_member.slice(&coff.mf)[@sizeOf(u32)..][0 .. len * @sizeOf(u32)]));
2405}2405}
24062406
2407pub fn secondLinkerMemberNumMembersPtr(coff: *Coff) *u32 {2407pub fn secondLinkerMemberNumMembersPtr(coff: *Coff) *align(2) u32 {
2408 assert(coff.isArchive());2408 assert(coff.isArchive());
2409 return @ptrCast(@alignCast(Node.known.second_linker_member.slice(&coff.mf)));2409 return @ptrCast(@alignCast(Node.known.second_linker_member.slice(&coff.mf)));
2410}2410}
24112411
2412pub fn secondLinkerMemberOffsetsSlice(coff: *Coff) []u32 {2412pub fn secondLinkerMemberOffsetsSlice(coff: *Coff) []align(2) u32 {
2413 const num_members = coff.targetLoad(coff.secondLinkerMemberNumMembersPtr());2413 const num_members = coff.targetLoad(coff.secondLinkerMemberNumMembersPtr());
2414 return @ptrCast(@alignCast(2414 return @ptrCast(@alignCast(
2415 Node.known.second_linker_member.slice(&coff.mf)[@sizeOf(u32)..][0 .. num_members * @sizeOf(u32)],2415 Node.known.second_linker_member.slice(&coff.mf)[@sizeOf(u32)..][0 .. num_members * @sizeOf(u32)],
2416 ));2416 ));
2417}2417}
24182418
2419pub fn secondLinkerMemberNumSymbolsPtr(coff: *Coff) *u32 {2419pub fn secondLinkerMemberNumSymbolsPtr(coff: *Coff) *align(2) u32 {
2420 const num_members = coff.targetLoad(coff.secondLinkerMemberNumMembersPtr());2420 const num_members = coff.targetLoad(coff.secondLinkerMemberNumMembersPtr());
2421 return @ptrCast(@alignCast(2421 return @ptrCast(@alignCast(
2422 Node.known.second_linker_member.slice(&coff.mf)[(1 + num_members) * @sizeOf(u32) ..],2422 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 {...@@ -2970,9 +2970,7 @@ fn ensureMemberSymbol(coff: *Coff, mi: Member.Index, name: String) !void {
2970 try coff.lib_string_table.append(gpa, name);2970 try coff.lib_string_table.append(gpa, name);
29712971
2972 const slice = Node.known.second_linker_member.slice(&coff.mf);2972 const slice = Node.known.second_linker_member.slice(&coff.mf);
2973 const num_symbols_ptr: *u32 = @ptrCast(@alignCast(slice[@sizeOf(u32) + num_members * @sizeOf(u32) ..]));2973 coff.targetStore(coff.secondLinkerMemberNumSymbolsPtr(), @intFromEnum(mfli) + 1);
2974 coff.targetStore(num_symbols_ptr, @intFromEnum(mfli) + 1);
2975
2976 if (!needs_sort) {2974 if (!needs_sort) {
2977 @memmove(slice[new_header_size..][0..coff.lib_string_len], slice[old_header_size..][0..coff.lib_string_len]);2975 @memmove(slice[new_header_size..][0..coff.lib_string_len], slice[old_header_size..][0..coff.lib_string_len]);
2978 @memcpy(slice[new_header_size + coff.lib_string_len ..][0..name_slice.len], name_slice[0..name_slice.len]);2976 @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(...@@ -4670,7 +4668,7 @@ fn loadObject(
46704668
4671 if (include_section) {4669 if (include_section) {
4672 assert(coff.getNode(symbol.si.get(coff).ni) == .input_section);4670 assert(coff.getNode(symbol.si.get(coff).ni) == .input_section);
4673 symbol.si.get(coff).extra = .{ .isli = @enumFromInt(coff.input_symbols.items.len) };4671 symbol.si.get(coff).setExtra(.{ .isli = @enumFromInt(coff.input_symbols.items.len) });
4674 coff.input_symbols.addOneAssumeCapacity().* = .{4672 coff.input_symbols.addOneAssumeCapacity().* = .{
4675 .si = symbol.si,4673 .si = symbol.si,
4676 .name = symbol.name,4674 .name = symbol.name,
test/link.zig+6-3
...@@ -44,9 +44,10 @@ pub fn addCases(ctx: *LinkContext) void {...@@ -44,9 +44,10 @@ pub fn addCases(ctx: *LinkContext) void {
44 .name_target = false,44 .name_target = false,
45 .zig_source_bytes =45 .zig_source_bytes =
46 \\fn weakFoo() callconv(.c) usize {46 \\fn weakFoo() callconv(.c) usize {
47 \\ return 0xaabbccdd;47 \\ return 0xaabbccddaabbccdd;
48 \\}48 \\}
49 \\export var strong_foo: usize = 0x11223344;49 \\export var array_foo: [2]u16 = .{ 0xffff, 0xabcd };
50 \\export var strong_foo: usize = 0x1122334411223344;
50 \\comptime {51 \\comptime {
51 \\ @export(&weakFoo, .{ .name = "weakFoo", .linkage = .weak });52 \\ @export(&weakFoo, .{ .name = "weakFoo", .linkage = .weak });
52 \\ @export(&strong_foo, .{ .name = "strong_foo_alias", .linkage = .strong });53 \\ @export(&strong_foo, .{ .name = "strong_foo_alias", .linkage = .strong });
...@@ -75,11 +76,13 @@ pub fn addCases(ctx: *LinkContext) void {...@@ -75,11 +76,13 @@ pub fn addCases(ctx: *LinkContext) void {
75 .zig_source_bytes =76 .zig_source_bytes =
76 \\extern fn fooBar() c_uint;77 \\extern fn fooBar() c_uint;
77 \\extern fn weakFoo() usize;78 \\extern fn weakFoo() usize;
79 \\extern var array_foo: [2]u16;
78 \\extern var strong_foo: usize;80 \\extern var strong_foo: usize;
79 \\extern var strong_foo_alias: usize;81 \\extern var strong_foo_alias: usize;
80 \\pub fn main() !u8 {82 \\pub fn main() !u8 {
81 \\ return @intFromBool(0xcd003368 != fooBar() +83 \\ return @intFromBool(0xcd003365cd00df35 != fooBar() +
82 \\ weakFoo() +84 \\ weakFoo() +
85 \\ array_foo[1] +
83 \\ strong_foo +86 \\ strong_foo +
84 \\ strong_foo_alias);87 \\ strong_foo_alias);
85 \\}88 \\}
test/link/snapshots/emit-static-lib.dmp+1
...@@ -5,5 +5,6 @@ xxxx 00000000 2 NULL EXTERNAL | foo1...@@ -5,5 +5,6 @@ xxxx 00000000 2 NULL EXTERNAL | foo1
5xxxx 00000004 2 NULL EXTERNAL | foo25xxxx 00000004 2 NULL EXTERNAL | foo2
6lib.lib(this_is_a_long_name.obj): COFF object6lib.lib(this_is_a_long_name.obj): COFF object
7xxxx 00000000 4 NULL() EXTERNAL | weakFoo7xxxx 00000000 4 NULL() EXTERNAL | weakFoo
8xxxx 00000010 2 NULL EXTERNAL | array_foo
8xxxx 00000000 2 NULL EXTERNAL | strong_foo_alias9xxxx 00000000 2 NULL EXTERNAL | strong_foo_alias
9xxxx 00000000 2 NULL EXTERNAL | strong_foo10xxxx 00000000 2 NULL EXTERNAL | strong_foo