Type Function ProgramHeaderIterator [src]

Prototype

pub fn ProgramHeaderIterator(comptime ParseSource: anytype) type

Source

pub fn ProgramHeaderIterator(comptime ParseSource: anytype) type { return struct { elf_header: Header, parse_source: ParseSource, index: usize = 0, pub fn next(self: *@This()) !?Elf64_Phdr { if (self.index >= self.elf_header.phnum) return null; defer self.index += 1; if (self.elf_header.is_64) { var phdr: Elf64_Phdr = undefined; const offset = self.elf_header.phoff + @sizeOf(@TypeOf(phdr)) * self.index; try self.parse_source.seekableStream().seekTo(offset); try self.parse_source.reader().readNoEof(mem.asBytes(&phdr)); // ELF endianness matches native endianness. if (self.elf_header.endian == native_endian) return phdr; // Convert fields to native endianness. mem.byteSwapAllFields(Elf64_Phdr, &phdr); return phdr; } var phdr: Elf32_Phdr = undefined; const offset = self.elf_header.phoff + @sizeOf(@TypeOf(phdr)) * self.index; try self.parse_source.seekableStream().seekTo(offset); try self.parse_source.reader().readNoEof(mem.asBytes(&phdr)); // ELF endianness does NOT match native endianness. if (self.elf_header.endian != native_endian) { // Convert fields to native endianness. mem.byteSwapAllFields(Elf32_Phdr, &phdr); } // Convert 32-bit header to 64-bit. return Elf64_Phdr{ .p_type = phdr.p_type, .p_offset = phdr.p_offset, .p_vaddr = phdr.p_vaddr, .p_paddr = phdr.p_paddr, .p_filesz = phdr.p_filesz, .p_memsz = phdr.p_memsz, .p_flags = phdr.p_flags, .p_align = phdr.p_align, }; } }; }