authorgravatar for mlugg@mlugg.co.ukMatthew Lugg <mlugg@mlugg.co.uk> 2026-05-20 12:58:26+01:00
committergravatar for mlugg@mlugg.co.ukMatthew Lugg <mlugg@mlugg.co.uk> 2026-05-26 06:30:28+01:00
logf097b4c3daff18d5dce1178831f294601f023b7b
tree6f45048643b47df7af1b18afde289f048de37587
parentf801995be40bbf10268c0fa7c13f255cd36b14c0
signaturelock-open Commit is signed but in an unrecognized format.

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).

1 files changed, 7 insertions(+), 1 deletions(-)

src/link/Elf2.zig+7-1
...@@ -3013,6 +3013,13 @@ fn loadArchive(elf: *Elf, path: std.Build.Cache.Path, fr: *Io.File.Reader) !void...@@ -3013,6 +3013,13 @@ fn loadArchive(elf: *Elf, path: std.Build.Cache.Path, fr: *Io.File.Reader) !void
3013 continue;3013 continue;
3014 }3014 }
3015 load_object: {3015 load_object: {
3016 if (std.mem.eql(u8, &header.ar_name, std.elf.SYMNAME) or
3017 std.mem.eql(u8, &header.ar_name, std.elf.SYM64NAME) or
3018 std.mem.eql(u8, &header.ar_name, std.elf.SYMDEFNAME) or
3019 std.mem.eql(u8, &header.ar_name, std.elf.SYMDEFSORTEDNAME))
3020 {
3021 break :load_object;
3022 }
3016 const member = header.name() orelse member: {3023 const member = header.name() orelse member: {
3017 const strtab_offset = header.nameOffset() catch |err| switch (err) {3024 const strtab_offset = header.nameOffset() catch |err| switch (err) {
3018 error.Overflow => break :member error.Overflow,3025 error.Overflow => break :member error.Overflow,
...@@ -3028,7 +3035,6 @@ fn loadArchive(elf: *Elf, path: std.Build.Cache.Path, fr: *Io.File.Reader) !void...@@ -3028,7 +3035,6 @@ fn loadArchive(elf: *Elf, path: std.Build.Cache.Path, fr: *Io.File.Reader) !void
3028 } catch |err| switch (err) {3035 } catch |err| switch (err) {
3029 error.Overflow => return diags.failParse(path, "bad member name offset", .{}),3036 error.Overflow => return diags.failParse(path, "bad member name offset", .{}),
3030 };3037 };
3031 if (!std.mem.endsWith(u8, member, ".o")) break :load_object;
3032 try elf.loadObject(path, member, fr, .{ .offset = offset, .size = size });3038 try elf.loadObject(path, member, fr, .{ .offset = offset, .size = size });
3033 }3039 }
3034 try fr.seekTo(std.mem.alignForward(u64, offset + size, 2));3040 try fr.seekTo(std.mem.alignForward(u64, offset + size, 2));