aboutsummaryrefslogtreecommitdiff
path: root/src/libmach/elf.h
blob: 6ed239bc2ce4ba9d2d6ccdfa51a296832423182d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
/*
 * Copyright (c) 2004 Russ Cox.  See LICENSE.
 */

/* /home/rsc/papers/elfXXelf.pdf */

typedef struct Elf Elf;
typedef struct ElfHdr ElfHdr;
typedef struct ElfSect ElfSect;
typedef struct ElfProg ElfProg;
typedef struct ElfNote ElfNote;
typedef struct ElfSym ElfSym;

enum
{
	ElfClassNone = 0,
	ElfClass32,
	ElfClass64,

	ElfDataNone = 0,
	ElfDataLsb,
	ElfDataMsb,

	ElfTypeNone = 0,
	ElfTypeRelocatable,
	ElfTypeExecutable,
	ElfTypeSharedObject,
	ElfTypeCore,
	/* 0xFF00 - 0xFFFF reserved for processor-specific types */

	ElfMachNone = 0,
	ElfMach32100,		/* AT&T WE 32100 */
	ElfMachSparc,		/* SPARC */
	ElfMach386,		/* Intel 80386 */
	ElfMach68000,		/* Motorola 68000 */
	ElfMach88000,		/* Motorola 88000 */
	ElfMach486,		/* Intel 80486, no longer used */
	ElfMach860,		/* Intel 80860 */
	ElfMachMips,		/* MIPS RS3000 */
	ElfMachS370,		/* IBM System/370 */
	ElfMachMipsLe,	/* MIPS RS3000 LE */
	ElfMachParisc = 15,		/* HP PA RISC */
	ElfMachVpp500 = 17,	/* Fujitsu VPP500 */
	ElfMachSparc32Plus,	/* SPARC V8+ */
	ElfMach960,		/* Intel 80960 */
	ElfMachPower,		/* PowerPC */
	ElfMachPower64,	/* PowerPC 64 */
	ElfMachS390,		/* IBM System/390 */
	ElfMachV800 = 36,	/* NEC V800 */
	ElfMachFr20,		/* Fujitsu FR20 */
	ElfMachRh32,		/* TRW RH-32 */
	ElfMachRce,		/* Motorola RCE */
	ElfMachArm,		/* ARM */
	ElfMachAlpha,		/* Digital Alpha */
	ElfMachSH,		/* Hitachi SH */
	ElfMachSparc9,		/* SPARC V9 */
	/* and the list goes on... */

	ElfAbiNone = 0,
	ElfAbiSystemV = 0,	/* [sic] */
	ElfAbiHPUX,
	ElfAbiNetBSD,
	ElfAbiLinux,
	ElfAbiSolaris = 6,
	ElfAbiAix,
	ElfAbiIrix,
	ElfAbiFreeBSD,
	ElfAbiTru64,
	ElfAbiModesto,
	ElfAbiOpenBSD,
	ElfAbiARM = 97,
	ElfAbiEmbedded = 255,

	/* some of sections 0xFF00 - 0xFFFF reserved for various things */
	ElfSectNone = 0,
	ElfSectProgbits,
	ElfSectSymtab,
	ElfSectStrtab,
	ElfSectRela,
	ElfSectHash,
	ElfSectDynamic,
	ElfSectNote,
	ElfSectNobits,
	ElfSectRel,
	ElfSectShlib,
	ElfSectDynsym,

	ElfSectFlagWrite = 0x1,
	ElfSectFlagAlloc = 0x2,
	ElfSectFlagExec = 0x4,
	/* 0xF0000000 are reserved for processor specific */

	ElfSymBindLocal = 0,
	ElfSymBindGlobal,
	ElfSymBindWeak,
	/* 13-15 reserved */

	ElfSymTypeNone = 0,
	ElfSymTypeObject,
	ElfSymTypeFunc,
	ElfSymTypeSection,
	ElfSymTypeFile,
	/* 13-15 reserved */

	ElfSymShnNone = 0,
	ElfSymShnAbs = 0xFFF1,
	ElfSymShnCommon = 0xFFF2,
	/* 0xFF00-0xFF1F reserved for processors */
	/* 0xFF20-0xFF3F reserved for operating systems */

	ElfProgNone = 0,
	ElfProgLoad,
	ElfProgDynamic,
	ElfProgInterp,
	ElfProgNote,
	ElfProgShlib,
	ElfProgPhdr,

	ElfProgFlagExec = 0x1,
	ElfProgFlagWrite = 0x2,
	ElfProgFlagRead = 0x4,

	ElfNotePrStatus = 1,
	ElfNotePrFpreg = 2,
	ElfNotePrPsinfo = 3,
	ElfNotePrTaskstruct = 4,
	ElfNotePrAuxv = 6,
	ElfNotePrXfpreg = 0x46e62b7f,	/* for gdb/386 */
};

struct ElfHdr
{
	uchar	magic[4];
	uchar	class;
	uchar	encoding;
	uchar	version;
	uchar	abi;
	uchar	abiversion;
	u32int	type;
	u32int	machine;
	u32int	entry;
	u32int	phoff;
	u32int	shoff;
	u32int	flags;
	u32int	ehsize;
	u32int	phentsize;
	u32int	phnum;
	u32int	shentsize;
	u32int	shnum;
	u32int	shstrndx;
	u16int	(*e2)(uchar*);
	u32int	(*e4)(uchar*);
	u64int	(*e8)(uchar*);
};

struct ElfSect
{
	char		*name;
	u32int	type;
	u32int	flags;
	u32int	addr;
	u32int	offset;
	u32int	size;
	u32int	link;
	u32int	info;
	u32int	align;
	u32int	entsize;
	uchar	*base;
};

struct ElfProg
{
	u32int	type;
	u32int	offset;
	u32int	vaddr;
	u32int	paddr;
	u32int	filesz;
	u32int	memsz;
	u32int	flags;
	u32int	align;
};

struct ElfNote
{
	u32int	namesz;
	u32int	descsz;
	u32int	type;
	char	*name;
	uchar	*desc;
	u32int	offset;	/* in-memory only */
};

struct ElfSym
{
	char*	name;
	u32int	value;
	u32int	size;
	uchar	bind;
	uchar	type;
	uchar	other;
	u16int	shndx;
};

struct Elf
{
	int		fd;
	ElfHdr	hdr;
	ElfSect	*sect;
	uint		nsect;
	ElfProg	*prog;
	uint		nprog;
	char		*shstrtab;

	int		nsymtab;
	ElfSect	*symtab;
	ElfSect	*symstr;
	int		ndynsym;
	ElfSect	*dynsym;
	ElfSect	*dynstr;
	ElfSect	*bss;

	int		(*coreregs)(Elf*, ElfNote*, uchar**);
};

Elf*	elfopen(char*);
Elf*	elfinit(int);
ElfSect *elfsection(Elf*, char*);
void	elfclose(Elf*);
int	elfsym(Elf*, int, ElfSym*);
int	elfmap(Elf*, ElfSect*);

int	coreregslinux386(Elf*, ElfNote*, uchar**);
int	coreregsfreebsd386(Elf*, ElfNote*, uchar**);