aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJakub Konka <kubkon@jakubkonka.com>2024-02-13 18:57:49 +0100
committerJakub Konka <kubkon@jakubkonka.com>2024-02-13 18:57:49 +0100
commitde30b30202f8327fd152dba8c74e40849c2ddad3 (patch)
treea2235b6ede1a17d408126dbceec1b1dec8e2920b /src
parente5483b4ffc20614463e42741f132a55d58c01880 (diff)
downloadzig-de30b30202f8327fd152dba8c74e40849c2ddad3.tar.gz
zig-de30b30202f8327fd152dba8c74e40849c2ddad3.zip
elf: scrap reader for preads when parsing archives
Diffstat (limited to 'src')
-rw-r--r--src/link/Elf/Archive.zig16
1 files changed, 7 insertions, 9 deletions
diff --git a/src/link/Elf/Archive.zig b/src/link/Elf/Archive.zig
index a2f83dda5a..dff8d09afa 100644
--- a/src/link/Elf/Archive.zig
+++ b/src/link/Elf/Archive.zig
@@ -21,18 +21,17 @@ pub fn parse(self: *Archive, elf_file: *Elf, path: []const u8, handle_index: Fil
const handle = elf_file.fileHandle(handle_index);
const size = (try handle.stat()).size;
- const reader = handle.reader();
- _ = try reader.readBytesNoEof(elf.ARMAG.len);
-
var pos: usize = elf.ARMAG.len;
while (true) {
if (pos >= size) break;
- if (!mem.isAligned(pos, 2)) {
- try handle.seekBy(1);
- pos += 1;
- }
+ if (!mem.isAligned(pos, 2)) pos += 1;
- const hdr = try reader.readStruct(elf.ar_hdr);
+ var hdr_buffer: [@sizeOf(elf.ar_hdr)]u8 = undefined;
+ {
+ const amt = try handle.preadAll(&hdr_buffer, pos);
+ if (amt != @sizeOf(elf.ar_hdr)) return error.InputOutput;
+ }
+ const hdr = @as(*align(1) const elf.ar_hdr, @ptrCast(&hdr_buffer)).*;
pos += @sizeOf(elf.ar_hdr);
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
const obj_size = try hdr.size();
defer {
- _ = handle.seekBy(obj_size) catch {};
pos += obj_size;
}