authorgravatar for ashe@kivikakk.eeAsherah Connor <ashe@kivikakk.ee> 2021-01-15 10:34:53+11:00
committergravatar for ashe@kivikakk.eeAsherah Connor <ashe@kivikakk.ee> 2021-01-15 10:34:53+11:00
logaffb57aad97240bf183015e6acba7eab4a9276bb
tree4fb325049997577b85b75d7119787edcffcd53cb
parent9168b217b23c5270328c3846fec61930ec7d2533

use interfaces


3 files changed, 15 insertions(+), 46 deletions(-)

lib/std/build/emit_raw.zig+3-4
...@@ -51,10 +51,9 @@ const BinaryElfOutput = struct {...@@ -51,10 +51,9 @@ const BinaryElfOutput = struct {
51 .segments = ArrayList(*BinaryElfSegment).init(allocator),51 .segments = ArrayList(*BinaryElfSegment).init(allocator),
52 .sections = ArrayList(*BinaryElfSection).init(allocator),52 .sections = ArrayList(*BinaryElfSection).init(allocator),
53 };53 };
54 const elf_source = std.elf.FileParseSource{ .file = elf_file };54 const elf_hdr = try std.elf.Header.read(&elf_file);
55 const elf_hdr = try std.elf.Header.read(elf_source);
5655
57 var section_headers = elf_hdr.section_header_iterator(elf_source);56 var section_headers = elf_hdr.section_header_iterator(&elf_file);
58 while (try section_headers.next()) |section| {57 while (try section_headers.next()) |section| {
59 if (sectionValidForOutput(section)) {58 if (sectionValidForOutput(section)) {
60 const newSection = try allocator.create(BinaryElfSection);59 const newSection = try allocator.create(BinaryElfSection);
...@@ -68,7 +67,7 @@ const BinaryElfOutput = struct {...@@ -68,7 +67,7 @@ const BinaryElfOutput = struct {
68 }67 }
69 }68 }
7069
71 var program_headers = elf_hdr.program_header_iterator(elf_source);70 var program_headers = elf_hdr.program_header_iterator(&elf_file);
72 while (try program_headers.next()) |phdr| {71 while (try program_headers.next()) |phdr| {
73 if (phdr.p_type == elf.PT_LOAD) {72 if (phdr.p_type == elf.PT_LOAD) {
74 const newSegment = try allocator.create(BinaryElfSegment);73 const newSegment = try allocator.create(BinaryElfSegment);
lib/std/elf.zig+10-39
...@@ -334,40 +334,6 @@ pub const ET = extern enum(u16) {...@@ -334,40 +334,6 @@ pub const ET = extern enum(u16) {
334 pub const HIPROC = 0xffff;334 pub const HIPROC = 0xffff;
335};335};
336336
337pub const FileParseSource = struct {
338 file: std.fs.File,
339
340 fn readNoEof(self: FileParseSource, buf: []u8, offset: u64) !void {
341 var i: usize = 0;
342 while (i < buf.len) {
343 const len = self.file.pread(buf[i .. buf.len - i], offset + i) catch |err| switch (err) {
344 error.SystemResources => return error.SystemResources,
345 error.IsDir => return error.UnableToReadElfFile,
346 error.OperationAborted => return error.UnableToReadElfFile,
347 error.BrokenPipe => return error.UnableToReadElfFile,
348 error.Unseekable => return error.UnableToReadElfFile,
349 error.ConnectionResetByPeer => return error.UnableToReadElfFile,
350 error.ConnectionTimedOut => return error.UnableToReadElfFile,
351 error.InputOutput => return error.FileSystem,
352 error.Unexpected => return error.Unexpected,
353 error.WouldBlock => return error.Unexpected,
354 error.NotOpenForReading => return error.Unexpected,
355 error.AccessDenied => return error.Unexpected,
356 };
357 if (len == 0) return error.UnexpectedEndOfFile;
358 i += len;
359 }
360 }
361};
362
363pub const BufferParseSource = struct {
364 buffer: []const u8,
365
366 fn readNoEof(self: BufferParseSource, buf: []u8, offset: u64) !void {
367 std.mem.copy(u8, buf, self.buffer[offset .. offset + buf.len]);
368 }
369};
370
371/// All integers are native endian.337/// All integers are native endian.
372pub const Header = struct {338pub const Header = struct {
373 endian: builtin.Endian,339 endian: builtin.Endian,
...@@ -397,7 +363,8 @@ pub const Header = struct {...@@ -397,7 +363,8 @@ pub const Header = struct {
397363
398 pub fn read(parse_source: anytype) !Header {364 pub fn read(parse_source: anytype) !Header {
399 var hdr_buf: [@sizeOf(Elf64_Ehdr)]u8 align(@alignOf(Elf64_Ehdr)) = undefined;365 var hdr_buf: [@sizeOf(Elf64_Ehdr)]u8 align(@alignOf(Elf64_Ehdr)) = undefined;
400 try parse_source.readNoEof(&hdr_buf, 0);366 try parse_source.seekableStream().seekTo(0);
367 try parse_source.reader().readNoEof(&hdr_buf);
401 return Header.parse(&hdr_buf);368 return Header.parse(&hdr_buf);
402 }369 }
403370
...@@ -448,7 +415,8 @@ pub fn ProgramHeaderIterator(ParseSource: anytype) type {...@@ -448,7 +415,8 @@ pub fn ProgramHeaderIterator(ParseSource: anytype) type {
448 if (self.elf_header.is_64) {415 if (self.elf_header.is_64) {
449 var phdr: Elf64_Phdr = undefined;416 var phdr: Elf64_Phdr = undefined;
450 const offset = self.elf_header.phoff + @sizeOf(@TypeOf(phdr)) * self.index;417 const offset = self.elf_header.phoff + @sizeOf(@TypeOf(phdr)) * self.index;
451 try self.parse_source.readNoEof(mem.asBytes(&phdr), offset);418 try self.parse_source.seekableStream().seekTo(offset);
419 try self.parse_source.reader().readNoEof(mem.asBytes(&phdr));
452420
453 // ELF endianness matches native endianness.421 // ELF endianness matches native endianness.
454 if (self.elf_header.endian == std.builtin.endian) return phdr;422 if (self.elf_header.endian == std.builtin.endian) return phdr;
...@@ -468,7 +436,8 @@ pub fn ProgramHeaderIterator(ParseSource: anytype) type {...@@ -468,7 +436,8 @@ pub fn ProgramHeaderIterator(ParseSource: anytype) type {
468436
469 var phdr: Elf32_Phdr = undefined;437 var phdr: Elf32_Phdr = undefined;
470 const offset = self.elf_header.phoff + @sizeOf(@TypeOf(phdr)) * self.index;438 const offset = self.elf_header.phoff + @sizeOf(@TypeOf(phdr)) * self.index;
471 try self.parse_source.readNoEof(mem.asBytes(&phdr), offset);439 try self.parse_source.seekableStream().seekTo(offset);
440 try self.parse_source.reader().readNoEof(mem.asBytes(&phdr));
472441
473 // ELF endianness does NOT match native endianness.442 // ELF endianness does NOT match native endianness.
474 if (self.elf_header.endian != std.builtin.endian) {443 if (self.elf_header.endian != std.builtin.endian) {
...@@ -513,7 +482,8 @@ pub fn SectionHeaderIterator(ParseSource: anytype) type {...@@ -513,7 +482,8 @@ pub fn SectionHeaderIterator(ParseSource: anytype) type {
513 if (self.elf_header.is_64) {482 if (self.elf_header.is_64) {
514 var shdr: Elf64_Shdr = undefined;483 var shdr: Elf64_Shdr = undefined;
515 const offset = self.elf_header.shoff + @sizeOf(@TypeOf(shdr)) * self.index;484 const offset = self.elf_header.shoff + @sizeOf(@TypeOf(shdr)) * self.index;
516 try self.parse_source.readNoEof(mem.asBytes(&shdr), offset);485 try self.parse_source.seekableStream().seekTo(offset);
486 try self.parse_source.reader().readNoEof(mem.asBytes(&shdr));
517487
518 // ELF endianness matches native endianness.488 // ELF endianness matches native endianness.
519 if (self.elf_header.endian == std.builtin.endian) return shdr;489 if (self.elf_header.endian == std.builtin.endian) return shdr;
...@@ -535,7 +505,8 @@ pub fn SectionHeaderIterator(ParseSource: anytype) type {...@@ -535,7 +505,8 @@ pub fn SectionHeaderIterator(ParseSource: anytype) type {
535505
536 var shdr: Elf32_Shdr = undefined;506 var shdr: Elf32_Shdr = undefined;
537 const offset = self.elf_header.shoff + @sizeOf(@TypeOf(shdr)) * self.index;507 const offset = self.elf_header.shoff + @sizeOf(@TypeOf(shdr)) * self.index;
538 try self.parse_source.readNoEof(mem.asBytes(&shdr), offset);508 try self.parse_source.seekableStream().seekTo(offset);
509 try self.parse_source.reader().readNoEof(mem.asBytes(&shdr));
539510
540 // ELF endianness does NOT match native endianness.511 // ELF endianness does NOT match native endianness.
541 if (self.elf_header.endian != std.builtin.endian) {512 if (self.elf_header.endian != std.builtin.endian) {
src/test.zig+2-3
...@@ -989,9 +989,8 @@ pub const TestContext = struct {...@@ -989,9 +989,8 @@ pub const TestContext = struct {
989 var file = try tmp_dir.openFile(bin_name, .{ .read = true });989 var file = try tmp_dir.openFile(bin_name, .{ .read = true });
990 defer file.close();990 defer file.close();
991991
992 const elf_source = std.elf.FileParseSource{ .file = file };992 const header = try std.elf.Header.read(&file);
993 const header = try std.elf.Header.read(elf_source);993 var iterator = header.program_header_iterator(&file);
994 var iterator = header.program_header_iterator(elf_source);
995994
996 var none_loaded = true;995 var none_loaded = true;
997996