def from_bytes(b, little=False): st_name, b = uint32.from_bytes(b, little=little) st_value, b = uint32.from_bytes(b, little=little) st_size, b = uint32.from_bytes(b, little=little) st_info, b = uint8.from_bytes(b, little=little) st_other, b = uint8.from_bytes(b, little=little) st_shndx, b = uint16.from_bytes(b, little=little) return Elf32_Sym(st_name.integer, st_value.integer, st_size.integer, st_info.integer, st_other.integer, st_shndx.integer, little), b
def from_bytes(b): e_ident, b = Elf32_e_ident.from_bytes(b) # througout this function we rely only on ELF header regarding # endianness little = e_ident.EI_DATA is ELFDATA.ELFDATA2LSB e_type, b = ET.from_bytes(b, little=little) e_machine, b = EM.from_bytes(b, little=little) # TODO: use Elf*_Word or similar to be able to create second header - # Elf64_Ehdr for amd64 e_version, b = uint32.from_bytes(b, little=little) e_entry, b = uint32.from_bytes(b, little=little) # || 64b e_phoff, b = uint32.from_bytes(b, little=little) # || 64b e_shoff, b = uint32.from_bytes(b, little=little) # || 64b e_flags, b = uint32.from_bytes(b, little=little) e_ehsize, b = uint16.from_bytes(b, little=little) e_phentsize, b = uint16.from_bytes(b, little=little) e_phnum, b = uint16.from_bytes(b, little=little) e_shentsize, b = uint16.from_bytes(b, little=little) e_shnum, b = uint16.from_bytes(b, little=little) e_shstrndx, b = uint16.from_bytes(b, little=little) Ehdr = Elf32_Ehdr(e_ident=e_ident, e_type=e_type, e_machine=e_machine, e_version=e_version.integer, e_entry=e_entry.integer, e_phoff=e_phoff.integer, e_shoff=e_shoff.integer, e_flags=e_flags.integer, e_ehsize=e_ehsize.integer, e_phentsize=e_phentsize.integer, e_phnum=e_phnum.integer, e_shentsize=e_shentsize.integer, e_shnum=e_shnum.integer, e_shstrndx=e_shstrndx.integer) return Ehdr, b