83 lines
1.6 KiB
Python
83 lines
1.6 KiB
Python
"""
|
|
#define EI_NIDENT 16
|
|
|
|
typedef struct {
|
|
unsigned char e_ident[EI_NIDENT];
|
|
uint16_t e_type;
|
|
uint16_t e_machine;
|
|
uint32_t e_version;
|
|
ElfN_Addr e_entry;
|
|
ElfN_Off e_phoff;
|
|
ElfN_Off e_shoff;
|
|
uint32_t e_flags;
|
|
uint16_t e_ehsize;
|
|
uint16_t e_phentsize;
|
|
uint16_t e_phnum;
|
|
uint16_t e_shentsize;
|
|
uint16_t e_shnum;
|
|
uint16_t e_shstrndx;
|
|
} ElfN_Ehdr;
|
|
"""
|
|
@dataclass
|
|
class ElfEhdr:
|
|
e_ident: bytes
|
|
e_type: int
|
|
e_machine: int
|
|
e_version: int
|
|
e_entry: int
|
|
e_phoff: int
|
|
e_shoff: int
|
|
e_flags: int
|
|
e_ehsize: int
|
|
e_phentsize: int
|
|
e_phnum: int
|
|
e_shentsize: int
|
|
e_shnum: int
|
|
e_shstrndx: int
|
|
|
|
ELFMAG0 = 0x7f
|
|
ELFMAG1 = ord('E')
|
|
ELFMAG2 = ord('L')
|
|
ELFMAG3 = ord('F')
|
|
|
|
EI_NIDENT = 16
|
|
|
|
elf_ident_fields = [
|
|
("EI_MAG0", 0),
|
|
("EI_MAG1", 1),
|
|
("EI_MAG2", 2),
|
|
("EI_MAG3", 3),
|
|
("EI_CLASS", 4),
|
|
("EI_DATA", 5),
|
|
("EI_VERSION", 6),
|
|
("EI_OSABI", 7),
|
|
("EI_ABIVERSION", 8),
|
|
("EI_PAD", 9),
|
|
]
|
|
|
|
class ElfClass(IntEnum):
|
|
NONE = 0
|
|
CLASS32 = 1
|
|
CLASS64 = 2
|
|
|
|
class ElfData(IntEnum):
|
|
NONE = 0
|
|
LSB = 1
|
|
MSB = 2
|
|
|
|
class OsABI(IntEnum):
|
|
NONE = 0
|
|
HPUX = 1
|
|
NETBSD = 2
|
|
GNU = 3
|
|
SOLARIS = 6
|
|
AIX = 7
|
|
IRIX = 8
|
|
FREEBSD = 9
|
|
TRU64 = 10
|
|
MODESTO = 11
|
|
OPENBSD = 12
|
|
ARM_AEABI = 64
|
|
ARM = 97
|
|
STANDALONE = 255
|