17dd7cddfSDavid du Colombier /* 25bdeb9a2SDavid du Colombier * Definitions needed for accessing ELF headers 37dd7cddfSDavid du Colombier */ 47dd7cddfSDavid du Colombier typedef struct { 54de34a7eSDavid du Colombier uchar ident[16]; /* ident bytes */ 67dd7cddfSDavid du Colombier ushort type; /* file type */ 77dd7cddfSDavid du Colombier ushort machine; /* target machine */ 87dd7cddfSDavid du Colombier int version; /* file version */ 97dd7cddfSDavid du Colombier ulong elfentry; /* start address */ 107dd7cddfSDavid du Colombier ulong phoff; /* phdr file offset */ 117dd7cddfSDavid du Colombier ulong shoff; /* shdr file offset */ 127dd7cddfSDavid du Colombier int flags; /* file flags */ 137dd7cddfSDavid du Colombier ushort ehsize; /* sizeof ehdr */ 147dd7cddfSDavid du Colombier ushort phentsize; /* sizeof phdr */ 157dd7cddfSDavid du Colombier ushort phnum; /* number phdrs */ 167dd7cddfSDavid du Colombier ushort shentsize; /* sizeof shdr */ 177dd7cddfSDavid du Colombier ushort shnum; /* number shdrs */ 187dd7cddfSDavid du Colombier ushort shstrndx; /* shdr string index */ 197dd7cddfSDavid du Colombier } Ehdr; 207dd7cddfSDavid du Colombier 217dd7cddfSDavid du Colombier typedef struct { 225bdeb9a2SDavid du Colombier u8int ident[16]; /* ident bytes */ 235bdeb9a2SDavid du Colombier u16int type; /* file type */ 245bdeb9a2SDavid du Colombier u16int machine; /* target machine */ 255bdeb9a2SDavid du Colombier u32int version; /* file version */ 265bdeb9a2SDavid du Colombier u64int elfentry; /* start address */ 275bdeb9a2SDavid du Colombier u64int phoff; /* phdr file offset */ 285bdeb9a2SDavid du Colombier u64int shoff; /* shdr file offset */ 295bdeb9a2SDavid du Colombier u32int flags; /* file flags */ 305bdeb9a2SDavid du Colombier u16int ehsize; /* sizeof ehdr */ 315bdeb9a2SDavid du Colombier u16int phentsize; /* sizeof phdr */ 325bdeb9a2SDavid du Colombier u16int phnum; /* number phdrs */ 335bdeb9a2SDavid du Colombier u16int shentsize; /* sizeof shdr */ 345bdeb9a2SDavid du Colombier u16int shnum; /* number shdrs */ 355bdeb9a2SDavid du Colombier u16int shstrndx; /* shdr string index */ 365bdeb9a2SDavid du Colombier } E64hdr; 375bdeb9a2SDavid du Colombier 385bdeb9a2SDavid du Colombier typedef struct { 397dd7cddfSDavid du Colombier int type; /* entry type */ 407dd7cddfSDavid du Colombier ulong offset; /* file offset */ 417dd7cddfSDavid du Colombier ulong vaddr; /* virtual address */ 427dd7cddfSDavid du Colombier ulong paddr; /* physical address */ 437dd7cddfSDavid du Colombier int filesz; /* file size */ 447dd7cddfSDavid du Colombier ulong memsz; /* memory size */ 457dd7cddfSDavid du Colombier int flags; /* entry flags */ 467dd7cddfSDavid du Colombier int align; /* memory/file alignment */ 477dd7cddfSDavid du Colombier } Phdr; 487dd7cddfSDavid du Colombier 497dd7cddfSDavid du Colombier typedef struct { 50d3993254SDavid du Colombier u32int type; /* entry type */ 51d3993254SDavid du Colombier u32int flags; /* entry flags */ 52d3993254SDavid du Colombier u64int offset; /* file offset */ 53d3993254SDavid du Colombier u64int vaddr; /* virtual address */ 54d3993254SDavid du Colombier u64int paddr; /* physical address */ 55d3993254SDavid du Colombier u64int filesz; /* file size */ 56d3993254SDavid du Colombier u64int memsz; /* memory size */ 57d3993254SDavid du Colombier u64int align; /* memory/file alignment */ 58d3993254SDavid du Colombier } P64hdr; 59d3993254SDavid du Colombier 60d3993254SDavid du Colombier typedef struct { 617dd7cddfSDavid du Colombier ulong name; /* section name */ 627dd7cddfSDavid du Colombier ulong type; /* SHT_... */ 637dd7cddfSDavid du Colombier ulong flags; /* SHF_... */ 647dd7cddfSDavid du Colombier ulong addr; /* virtual address */ 657dd7cddfSDavid du Colombier ulong offset; /* file offset */ 667dd7cddfSDavid du Colombier ulong size; /* section size */ 677dd7cddfSDavid du Colombier ulong link; /* misc info */ 687dd7cddfSDavid du Colombier ulong info; /* misc info */ 697dd7cddfSDavid du Colombier ulong addralign; /* memory alignment */ 707dd7cddfSDavid du Colombier ulong entsize; /* entry size if table */ 717dd7cddfSDavid du Colombier } Shdr; 727dd7cddfSDavid du Colombier 73d3993254SDavid du Colombier typedef struct { 74d3993254SDavid du Colombier u32int name; /* section name */ 75d3993254SDavid du Colombier u32int type; /* SHT_... */ 76d3993254SDavid du Colombier u64int flags; /* SHF_... */ 77d3993254SDavid du Colombier u64int addr; /* virtual address */ 78d3993254SDavid du Colombier u64int offset; /* file offset */ 79d3993254SDavid du Colombier u64int size; /* section size */ 80d3993254SDavid du Colombier u32int link; /* misc info */ 81d3993254SDavid du Colombier u32int info; /* misc info */ 82d3993254SDavid du Colombier u64int addralign; /* memory alignment */ 83d3993254SDavid du Colombier u64int entsize; /* entry size if table */ 84d3993254SDavid du Colombier } S64hdr; 85d3993254SDavid du Colombier 867dd7cddfSDavid du Colombier enum { 877dd7cddfSDavid du Colombier /* Ehdr codes */ 887dd7cddfSDavid du Colombier MAG0 = 0, /* ident[] indexes */ 897dd7cddfSDavid du Colombier MAG1 = 1, 907dd7cddfSDavid du Colombier MAG2 = 2, 917dd7cddfSDavid du Colombier MAG3 = 3, 927dd7cddfSDavid du Colombier CLASS = 4, 937dd7cddfSDavid du Colombier DATA = 5, 947dd7cddfSDavid du Colombier VERSION = 6, 957dd7cddfSDavid du Colombier 967dd7cddfSDavid du Colombier ELFCLASSNONE = 0, /* ident[CLASS] */ 977dd7cddfSDavid du Colombier ELFCLASS32 = 1, 987dd7cddfSDavid du Colombier ELFCLASS64 = 2, 997dd7cddfSDavid du Colombier ELFCLASSNUM = 3, 1007dd7cddfSDavid du Colombier 1017dd7cddfSDavid du Colombier ELFDATANONE = 0, /* ident[DATA] */ 1027dd7cddfSDavid du Colombier ELFDATA2LSB = 1, 1037dd7cddfSDavid du Colombier ELFDATA2MSB = 2, 1047dd7cddfSDavid du Colombier ELFDATANUM = 3, 1057dd7cddfSDavid du Colombier 1067dd7cddfSDavid du Colombier NOETYPE = 0, /* type */ 1077dd7cddfSDavid du Colombier REL = 1, 1087dd7cddfSDavid du Colombier EXEC = 2, 1097dd7cddfSDavid du Colombier DYN = 3, 1107dd7cddfSDavid du Colombier CORE = 4, 1117dd7cddfSDavid du Colombier 1127dd7cddfSDavid du Colombier NONE = 0, /* machine */ 1137dd7cddfSDavid du Colombier M32 = 1, /* AT&T WE 32100 */ 1147dd7cddfSDavid du Colombier SPARC = 2, /* Sun SPARC */ 1157dd7cddfSDavid du Colombier I386 = 3, /* Intel 80386 */ 1167dd7cddfSDavid du Colombier M68K = 4, /* Motorola 68000 */ 1177dd7cddfSDavid du Colombier M88K = 5, /* Motorola 88000 */ 1187dd7cddfSDavid du Colombier I486 = 6, /* Intel 80486 */ 1197dd7cddfSDavid du Colombier I860 = 7, /* Intel i860 */ 1207dd7cddfSDavid du Colombier MIPS = 8, /* Mips R2000 */ 1217dd7cddfSDavid du Colombier S370 = 9, /* Amdhal */ 122*4439694fSDavid du Colombier MIPSR4K = 10, /* Mips R4000 */ 123b0dcc5a8SDavid du Colombier SPARC64 = 18, /* Sun SPARC v9 */ 124617c0e1eSDavid du Colombier POWER = 20, /* PowerPC */ 1255bdeb9a2SDavid du Colombier POWER64 = 21, /* PowerPC64 */ 126617c0e1eSDavid du Colombier ARM = 40, /* ARM */ 127b0dcc5a8SDavid du Colombier AMD64 = 62, /* Amd64 */ 128e6dac696SDavid du Colombier ARM64 = 183, /* ARM64 */ 1297dd7cddfSDavid du Colombier 1307dd7cddfSDavid du Colombier NO_VERSION = 0, /* version, ident[VERSION] */ 1317dd7cddfSDavid du Colombier CURRENT = 1, 1327dd7cddfSDavid du Colombier 1337dd7cddfSDavid du Colombier /* Phdr Codes */ 1347dd7cddfSDavid du Colombier NOPTYPE = 0, /* type */ 1357dd7cddfSDavid du Colombier LOAD = 1, 1367dd7cddfSDavid du Colombier DYNAMIC = 2, 1377dd7cddfSDavid du Colombier INTERP = 3, 1387dd7cddfSDavid du Colombier NOTE = 4, 1397dd7cddfSDavid du Colombier SHLIB = 5, 1407dd7cddfSDavid du Colombier PHDR = 6, 1417dd7cddfSDavid du Colombier 1427dd7cddfSDavid du Colombier R = 0x4, /* flags */ 1437dd7cddfSDavid du Colombier W = 0x2, 1447dd7cddfSDavid du Colombier X = 0x1, 145617c0e1eSDavid du Colombier 146617c0e1eSDavid du Colombier /* Shdr Codes */ 147617c0e1eSDavid du Colombier Progbits = 1, /* section types */ 148617c0e1eSDavid du Colombier Strtab = 3, 149617c0e1eSDavid du Colombier Nobits = 8, 150617c0e1eSDavid du Colombier 151617c0e1eSDavid du Colombier Swrite = 1, /* section attributes */ 152617c0e1eSDavid du Colombier Salloc = 2, 153617c0e1eSDavid du Colombier Sexec = 4, 1547dd7cddfSDavid du Colombier }; 1557dd7cddfSDavid du Colombier 1567dd7cddfSDavid du Colombier #define ELF_MAG ((0x7f<<24) | ('E'<<16) | ('L'<<8) | 'F') 157