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 {
24042404 return @ptrCast(@alignCast(Node.known.first_linker_member.slice(&coff.mf)[@sizeOf(u32)..][0 .. len * @sizeOf(u32)]));
24052405}
24062406
2407pub fn secondLinkerMemberNumMembersPtr(coff: *Coff) *u32 {
2407pub fn secondLinkerMemberNumMembersPtr(coff: *Coff) *align(2) u32 {
24082408 assert(coff.isArchive());
24092409 return @ptrCast(@alignCast(Node.known.second_linker_member.slice(&coff.mf)));
24102410}
24112411
2412pub fn secondLinkerMemberOffsetsSlice(coff: *Coff) []u32 {
2412pub fn secondLinkerMemberOffsetsSlice(coff: *Coff) []align(2) u32 {
24132413 const num_members = coff.targetLoad(coff.secondLinkerMemberNumMembersPtr());
24142414 return @ptrCast(@alignCast(
24152415 Node.known.second_linker_member.slice(&coff.mf)[@sizeOf(u32)..][0 .. num_members * @sizeOf(u32)],
24162416 ));
24172417}
24182418
2419pub fn secondLinkerMemberNumSymbolsPtr(coff: *Coff) *u32 {
2419pub fn secondLinkerMemberNumSymbolsPtr(coff: *Coff) *align(2) u32 {
24202420 const num_members = coff.targetLoad(coff.secondLinkerMemberNumMembersPtr());
24212421 return @ptrCast(@alignCast(
24222422 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 {
29702970 try coff.lib_string_table.append(gpa, name);
29712971
29722972 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) ..]));
2974 coff.targetStore(num_symbols_ptr, @intFromEnum(mfli) + 1);
2975
2973 coff.targetStore(coff.secondLinkerMemberNumSymbolsPtr(), @intFromEnum(mfli) + 1);
29762974 if (!needs_sort) {
29772975 @memmove(slice[new_header_size..][0..coff.lib_string_len], slice[old_header_size..][0..coff.lib_string_len]);
29782976 @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(
46704668
46714669 if (include_section) {
46724670 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) });
46744672 coff.input_symbols.addOneAssumeCapacity().* = .{
46754673 .si = symbol.si,
46764674 .name = symbol.name,
test/link.zig+6-3
......@@ -44,9 +44,10 @@ pub fn addCases(ctx: *LinkContext) void {
4444 .name_target = false,
4545 .zig_source_bytes =
4646 \\fn weakFoo() callconv(.c) usize {
47 \\ return 0xaabbccdd;
47 \\ return 0xaabbccddaabbccdd;
4848 \\}
49 \\export var strong_foo: usize = 0x11223344;
49 \\export var array_foo: [2]u16 = .{ 0xffff, 0xabcd };
50 \\export var strong_foo: usize = 0x1122334411223344;
5051 \\comptime {
5152 \\ @export(&weakFoo, .{ .name = "weakFoo", .linkage = .weak });
5253 \\ @export(&strong_foo, .{ .name = "strong_foo_alias", .linkage = .strong });
......@@ -75,11 +76,13 @@ pub fn addCases(ctx: *LinkContext) void {
7576 .zig_source_bytes =
7677 \\extern fn fooBar() c_uint;
7778 \\extern fn weakFoo() usize;
79 \\extern var array_foo: [2]u16;
7880 \\extern var strong_foo: usize;
7981 \\extern var strong_foo_alias: usize;
8082 \\pub fn main() !u8 {
81 \\ return @intFromBool(0xcd003368 != fooBar() +
83 \\ return @intFromBool(0xcd003365cd00df35 != fooBar() +
8284 \\ weakFoo() +
85 \\ array_foo[1] +
8386 \\ strong_foo +
8487 \\ strong_foo_alias);
8588 \\}
test/link/snapshots/emit-static-lib.dmp+1
......@@ -5,5 +5,6 @@ xxxx 00000000 2 NULL EXTERNAL | foo1
55xxxx 00000004 2 NULL EXTERNAL | foo2
66lib.lib(this_is_a_long_name.obj): COFF object
77xxxx 00000000 4 NULL() EXTERNAL | weakFoo
8xxxx 00000010 2 NULL EXTERNAL | array_foo
89xxxx 00000000 2 NULL EXTERNAL | strong_foo_alias
910xxxx 00000000 2 NULL EXTERNAL | strong_foo