/* * Definitions needed for accessing ELF headers */ typedef struct { uchar ident[16]; /* ident bytes */ ushort type; /* file type */ ushort machine; /* target machine */ int version; /* file version */ ulong elfentry; /* start address */ ulong phoff; /* phdr file offset */ ulong shoff; /* shdr file offset */ int flags; /* file flags */ ushort ehsize; /* sizeof ehdr */ ushort phentsize; /* sizeof phdr */ ushort phnum; /* number phdrs */ ushort shentsize; /* sizeof shdr */ ushort shnum; /* number shdrs */ ushort shstrndx; /* shdr string index */ } Ehdr; typedef struct { u8int ident[16]; /* ident bytes */ u16int type; /* file type */ u16int machine; /* target machine */ u32int version; /* file version */ u64int elfentry; /* start address */ u64int phoff; /* phdr file offset */ u64int shoff; /* shdr file offset */ u32int flags; /* file flags */ u16int ehsize; /* sizeof ehdr */ u16int phentsize; /* sizeof phdr */ u16int phnum; /* number phdrs */ u16int shentsize; /* sizeof shdr */ u16int shnum; /* number shdrs */ u16int shstrndx; /* shdr string index */ } E64hdr; typedef struct { int type; /* entry type */ ulong offset; /* file offset */ ulong vaddr; /* virtual address */ ulong paddr; /* physical address */ int filesz; /* file size */ ulong memsz; /* memory size */ int flags; /* entry flags */ int align; /* memory/file alignment */ } Phdr; typedef struct { u32int type; /* entry type */ u32int flags; /* entry flags */ u64int offset; /* file offset */ u64int vaddr; /* virtual address */ u64int paddr; /* physical address */ u64int filesz; /* file size */ u64int memsz; /* memory size */ u64int align; /* memory/file alignment */ } P64hdr; typedef struct { ulong name; /* section name */ ulong type; /* SHT_... */ ulong flags; /* SHF_... */ ulong addr; /* virtual address */ ulong offset; /* file offset */ ulong size; /* section size */ ulong link; /* misc info */ ulong info; /* misc info */ ulong addralign; /* memory alignment */ ulong entsize; /* entry size if table */ } Shdr; typedef struct { u32int name; /* section name */ u32int type; /* SHT_... */ u64int flags; /* SHF_... */ u64int addr; /* virtual address */ u64int offset; /* file offset */ u64int size; /* section size */ u32int link; /* misc info */ u32int info; /* misc info */ u64int addralign; /* memory alignment */ u64int entsize; /* entry size if table */ } S64hdr; enum { /* Ehdr codes */ MAG0 = 0, /* ident[] indexes */ MAG1 = 1, MAG2 = 2, MAG3 = 3, CLASS = 4, DATA = 5, VERSION = 6, ELFCLASSNONE = 0, /* ident[CLASS] */ ELFCLASS32 = 1, ELFCLASS64 = 2, ELFCLASSNUM = 3, ELFDATANONE = 0, /* ident[DATA] */ ELFDATA2LSB = 1, ELFDATA2MSB = 2, ELFDATANUM = 3, NOETYPE = 0, /* type */ REL = 1, EXEC = 2, DYN = 3, CORE = 4, NONE = 0, /* machine */ M32 = 1, /* AT&T WE 32100 */ SPARC = 2, /* Sun SPARC */ I386 = 3, /* Intel 80386 */ M68K = 4, /* Motorola 68000 */ M88K = 5, /* Motorola 88000 */ I486 = 6, /* Intel 80486 */ I860 = 7, /* Intel i860 */ MIPS = 8, /* Mips R2000 */ S370 = 9, /* Amdhal */ MIPSR4K = 10, /* Mips R4000 */ SPARC64 = 18, /* Sun SPARC v9 */ POWER = 20, /* PowerPC */ POWER64 = 21, /* PowerPC64 */ ARM = 40, /* ARM */ AMD64 = 62, /* Amd64 */ ARM64 = 183, /* ARM64 */ NO_VERSION = 0, /* version, ident[VERSION] */ CURRENT = 1, /* Phdr Codes */ NOPTYPE = 0, /* type */ LOAD = 1, DYNAMIC = 2, INTERP = 3, NOTE = 4, SHLIB = 5, PHDR = 6, R = 0x4, /* flags */ W = 0x2, X = 0x1, /* Shdr Codes */ Progbits = 1, /* section types */ Strtab = 3, Nobits = 8, Swrite = 1, /* section attributes */ Salloc = 2, Sexec = 4, }; #define ELF_MAG ((0x7f<<24) | ('E'<<16) | ('L'<<8) | 'F')