zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

commit f097b4c3daff18d5dce1178831f294601f023b7b (tree)
parent f801995be40bbf10268c0fa7c13f255cd36b14c0
Author: Matthew Lugg <mlugg@mlugg.co.uk>
Date:   Wed, 20 May 2026 12:58:26 +0100

Elf2: fix loading of archives with atypical object names

For instance, my system's `/lib/libc_nonshared.a` contains objects whose
names end `.oS` rather than `.o`. It's incorrect to ignore all archive
members which don't match a given extension---intead, we need only skip
the members which have specific other meanings (i.e. the symtab file).

Diffstat:
Msrc/link/Elf2.zig | 8+++++++-
1 file changed, 7 insertions(+), 1 deletion(-)

diff --git a/src/link/Elf2.zig b/src/link/Elf2.zig @@ -3013,6 +3013,13 @@ fn loadArchive(elf: *Elf, path: std.Build.Cache.Path, fr: *Io.File.Reader) !void continue; } load_object: { + if (std.mem.eql(u8, &header.ar_name, std.elf.SYMNAME) or + std.mem.eql(u8, &header.ar_name, std.elf.SYM64NAME) or + std.mem.eql(u8, &header.ar_name, std.elf.SYMDEFNAME) or + std.mem.eql(u8, &header.ar_name, std.elf.SYMDEFSORTEDNAME)) + { + break :load_object; + } const member = header.name() orelse member: { const strtab_offset = header.nameOffset() catch |err| switch (err) { error.Overflow => break :member error.Overflow, @@ -3028,7 +3035,6 @@ fn loadArchive(elf: *Elf, path: std.Build.Cache.Path, fr: *Io.File.Reader) !void } catch |err| switch (err) { error.Overflow => return diags.failParse(path, "bad member name offset", .{}), }; - if (!std.mem.endsWith(u8, member, ".o")) break :load_object; try elf.loadObject(path, member, fr, .{ .offset = offset, .size = size }); } try fr.seekTo(std.mem.alignForward(u64, offset + size, 2));