struct Header [src]

All integers are native endian.

Fields

is_64: bool
endian: std.builtin.Endian
os_abi: OSABI
abi_version: u8The meaning of this value depends on os_abi.
type: ET
machine: EM
entry: u64
phoff: u64
shoff: u64
phentsize: u16
phnum: u16
shentsize: u16
shnum: u16
shstrndx: u16

Members

Source

pub const Header = struct { is_64: bool, endian: std.builtin.Endian, os_abi: OSABI, /// The meaning of this value depends on `os_abi`. abi_version: u8, type: ET, machine: EM, entry: u64, phoff: u64, shoff: u64, phentsize: u16, phnum: u16, shentsize: u16, shnum: u16, shstrndx: u16, pub fn iterateProgramHeaders(h: Header, file_reader: *std.fs.File.Reader) ProgramHeaderIterator { return .{ .elf_header = h, .file_reader = file_reader, }; } pub fn iterateProgramHeadersBuffer(h: Header, buf: []const u8) ProgramHeaderBufferIterator { return .{ .elf_header = h, .buf = buf, }; } pub fn iterateSectionHeaders(h: Header, file_reader: *std.fs.File.Reader) SectionHeaderIterator { return .{ .elf_header = h, .file_reader = file_reader, }; } pub fn iterateSectionHeadersBuffer(h: Header, buf: []const u8) SectionHeaderBufferIterator { return .{ .elf_header = h, .buf = buf, }; } pub const ReadError = std.Io.Reader.Error || error{ InvalidElfMagic, InvalidElfVersion, InvalidElfClass, InvalidElfEndian, }; pub fn read(r: *std.Io.Reader) ReadError!Header { const buf = try r.peek(@sizeOf(Elf64_Ehdr)); if (!mem.eql(u8, buf[0..4], MAGIC)) return error.InvalidElfMagic; if (buf[EI_VERSION] != 1) return error.InvalidElfVersion; const endian: std.builtin.Endian = switch (buf[EI_DATA]) { ELFDATA2LSB => .little, ELFDATA2MSB => .big, else => return error.InvalidElfEndian, }; return switch (buf[EI_CLASS]) { ELFCLASS32 => .init(try r.takeStruct(Elf32_Ehdr, endian), endian), ELFCLASS64 => .init(try r.takeStruct(Elf64_Ehdr, endian), endian), else => return error.InvalidElfClass, }; } pub fn init(hdr: anytype, endian: std.builtin.Endian) Header { // Converting integers to exhaustive enums using `@enumFromInt` could cause a panic. comptime assert(!@typeInfo(OSABI).@"enum".is_exhaustive); return .{ .is_64 = switch (@TypeOf(hdr)) { Elf32_Ehdr => false, Elf64_Ehdr => true, else => @compileError("bad type"), }, .endian = endian, .os_abi = @enumFromInt(hdr.e_ident[EI_OSABI]), .abi_version = hdr.e_ident[EI_ABIVERSION], .type = hdr.e_type, .machine = hdr.e_machine, .entry = hdr.e_entry, .phoff = hdr.e_phoff, .shoff = hdr.e_shoff, .phentsize = hdr.e_phentsize, .phnum = hdr.e_phnum, .shentsize = hdr.e_shentsize, .shnum = hdr.e_shnum, .shstrndx = hdr.e_shstrndx, }; } }