xref: /plan9/sys/src/libmach/elf.h (revision 4439694f4201945b1468b22da393c4f0ad5bf493)
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