authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2024-02-13 18:57:49+01:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2024-02-13 18:57:49+01:00
logde30b30202f8327fd152dba8c74e40849c2ddad3
treea2235b6ede1a17d408126dbceec1b1dec8e2920b
parente5483b4ffc20614463e42741f132a55d58c01880

elf: scrap reader for preads when parsing archives


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

src/link/Elf/Archive.zig+7-9
...@@ -21,18 +21,17 @@ pub fn parse(self: *Archive, elf_file: *Elf, path: []const u8, handle_index: Fil...@@ -21,18 +21,17 @@ pub fn parse(self: *Archive, elf_file: *Elf, path: []const u8, handle_index: Fil
21 const handle = elf_file.fileHandle(handle_index);21 const handle = elf_file.fileHandle(handle_index);
22 const size = (try handle.stat()).size;22 const size = (try handle.stat()).size;
2323
24 const reader = handle.reader();
25 _ = try reader.readBytesNoEof(elf.ARMAG.len);
26
27 var pos: usize = elf.ARMAG.len;24 var pos: usize = elf.ARMAG.len;
28 while (true) {25 while (true) {
29 if (pos >= size) break;26 if (pos >= size) break;
30 if (!mem.isAligned(pos, 2)) {27 if (!mem.isAligned(pos, 2)) pos += 1;
31 try handle.seekBy(1);
32 pos += 1;
33 }
3428
35 const hdr = try reader.readStruct(elf.ar_hdr);29 var hdr_buffer: [@sizeOf(elf.ar_hdr)]u8 = undefined;
30 {
31 const amt = try handle.preadAll(&hdr_buffer, pos);
32 if (amt != @sizeOf(elf.ar_hdr)) return error.InputOutput;
33 }
34 const hdr = @as(*align(1) const elf.ar_hdr, @ptrCast(&hdr_buffer)).*;
36 pos += @sizeOf(elf.ar_hdr);35 pos += @sizeOf(elf.ar_hdr);
3736
38 if (!mem.eql(u8, &hdr.ar_fmag, elf.ARFMAG)) {37 if (!mem.eql(u8, &hdr.ar_fmag, elf.ARFMAG)) {
...@@ -44,7 +43,6 @@ pub fn parse(self: *Archive, elf_file: *Elf, path: []const u8, handle_index: Fil...@@ -44,7 +43,6 @@ pub fn parse(self: *Archive, elf_file: *Elf, path: []const u8, handle_index: Fil
4443
45 const obj_size = try hdr.size();44 const obj_size = try hdr.size();
46 defer {45 defer {
47 _ = handle.seekBy(obj_size) catch {};
48 pos += obj_size;46 pos += obj_size;
49 }47 }
5048