authorgravatar for carl@astholm.seCarl Åstholm <carl@astholm.se> 2025-11-05 16:34:07+01:00
committergravatar for squeek502@hotmail.comRyan Liptak <squeek502@hotmail.com> 2025-11-08 02:11:52-08:00
log43eb9b52ccac894023800115e8395cdb413be14a
tree66a3070f42960d9e7b8c1ec83b8e0043a6dd764a
parent38d44404a589590e0443444f2206d7e9859b09fe

link.Elf: Ensure archive header fields are not left blank

ld.lld fails with "truncated or malformed archive" errors when reading archive header field values that are not valid numbers.

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

src/link/Elf/Archive.zig+5-1
...@@ -118,7 +118,6 @@ pub fn setArHdr(opts: struct {...@@ -118,7 +118,6 @@ pub fn setArHdr(opts: struct {
118 .ar_fmag = undefined,118 .ar_fmag = undefined,
119 };119 };
120 @memset(mem.asBytes(&hdr), 0x20);120 @memset(mem.asBytes(&hdr), 0x20);
121 @memcpy(&hdr.ar_fmag, elf.ARFMAG);
122121
123 {122 {
124 var writer: std.Io.Writer = .fixed(&hdr.ar_name);123 var writer: std.Io.Writer = .fixed(&hdr.ar_name);
...@@ -129,10 +128,15 @@ pub fn setArHdr(opts: struct {...@@ -129,10 +128,15 @@ pub fn setArHdr(opts: struct {
129 .name_off => |x| writer.print("/{d}", .{x}) catch unreachable,128 .name_off => |x| writer.print("/{d}", .{x}) catch unreachable,
130 }129 }
131 }130 }
131 hdr.ar_date[0] = '0';
132 hdr.ar_uid[0] = '0';
133 hdr.ar_gid[0] = '0';
134 hdr.ar_mode[0] = '0';
132 {135 {
133 var writer: std.Io.Writer = .fixed(&hdr.ar_size);136 var writer: std.Io.Writer = .fixed(&hdr.ar_size);
134 writer.print("{d}", .{opts.size}) catch unreachable;137 writer.print("{d}", .{opts.size}) catch unreachable;
135 }138 }
139 hdr.ar_fmag = elf.ARFMAG.*;
136140
137 return hdr;141 return hdr;
138}142}