Type Function SectionHeaderIterator [src]

Prototype

pub fn SectionHeaderIterator(comptime ParseSource: anytype) type

Source

pub fn SectionHeaderIterator(comptime ParseSource: anytype) type { return struct { elf_header: Header, parse_source: ParseSource, index: usize = 0, pub fn next(self: *@This()) !?Elf64_Shdr { if (self.index >= self.elf_header.shnum) return null; defer self.index += 1; if (self.elf_header.is_64) { var shdr: Elf64_Shdr = undefined; const offset = self.elf_header.shoff + @sizeOf(@TypeOf(shdr)) * self.index; try self.parse_source.seekableStream().seekTo(offset); try self.parse_source.reader().readNoEof(mem.asBytes(&shdr)); // ELF endianness matches native endianness. if (self.elf_header.endian == native_endian) return shdr; // Convert fields to native endianness. mem.byteSwapAllFields(Elf64_Shdr, &shdr); return shdr; } var shdr: Elf32_Shdr = undefined; const offset = self.elf_header.shoff + @sizeOf(@TypeOf(shdr)) * self.index; try self.parse_source.seekableStream().seekTo(offset); try self.parse_source.reader().readNoEof(mem.asBytes(&shdr)); // ELF endianness does NOT match native endianness. if (self.elf_header.endian != native_endian) { // Convert fields to native endianness. mem.byteSwapAllFields(Elf32_Shdr, &shdr); } // Convert 32-bit header to 64-bit. return Elf64_Shdr{ .sh_name = shdr.sh_name, .sh_type = shdr.sh_type, .sh_flags = shdr.sh_flags, .sh_addr = shdr.sh_addr, .sh_offset = shdr.sh_offset, .sh_size = shdr.sh_size, .sh_link = shdr.sh_link, .sh_info = shdr.sh_info, .sh_addralign = shdr.sh_addralign, .sh_entsize = shdr.sh_entsize, }; } }; }