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:
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));