aboutsummaryrefslogtreecommitdiff
path: root/backends/platform/gp2xwiz/elf32.h
blob: bd9ae9333237900db05b88fad80eab8d62bbc490 (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
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
/* ScummVM - Graphic Adventure Engine
 *
 * ScummVM is the legal property of its developers, whose names
 * are too numerous to list here. Please refer to the COPYRIGHT
 * file distributed with this source distribution.
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.

 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.

 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 *
 * $URL$
 * $Id$
 *
 */

#ifndef BACKENDS_ELF_H
#define BACKENDS_ELF_H

/* ELF stuff */

typedef unsigned short Elf32_Half, Elf32_Section;
typedef unsigned int Elf32_Word, Elf32_Addr, Elf32_Off;
typedef signed int  Elf32_Sword;
typedef Elf32_Half Elf32_Versym;

#define EI_NIDENT (16)
#define SELFMAG         6

/* ELF File format structures. Look up ELF structure for more details */

// ELF header (contains info about the file)
typedef struct {
	unsigned char e_ident[EI_NIDENT];     /* Magic number and other info */
	Elf32_Half    e_type;                 /* Object file type */
	Elf32_Half    e_machine;              /* Architecture */
	Elf32_Word    e_version;              /* Object file version */
	Elf32_Addr    e_entry;                /* Entry point virtual address */
	Elf32_Off     e_phoff;                /* Program header table file offset */
	Elf32_Off     e_shoff;                /* Section header table file offset */
	Elf32_Word    e_flags;                /* Processor-specific flags */
	Elf32_Half    e_ehsize;               /* ELF header size in bytes */
	Elf32_Half    e_phentsize;            /* Program header table entry size */
	Elf32_Half    e_phnum;                /* Program header table entry count */
	Elf32_Half    e_shentsize;            /* Section header table entry size */
	Elf32_Half    e_shnum;                /* Section header table entry count */
	Elf32_Half    e_shstrndx;             /* Section header string table index */
} Elf32_Ehdr;

// Should be in e_ident
#define ELFMAG          "\177ELF\1\1"	/* ELF Magic number */

// e_type values
#define ET_NONE		0	/* no file type */
#define ET_REL		1	/* relocatable */
#define ET_EXEC		2	/* executable */
#define ET_DYN		3	/* shared object */
#define ET_CORE		4	/* core file */

// e_machine values
#define EM_ARM		40

// Program header (contains info about segment)
typedef struct {
	Elf32_Word    p_type;                 /* Segment type */
	Elf32_Off     p_offset;               /* Segment file offset */
	Elf32_Addr    p_vaddr;                /* Segment virtual address */
	Elf32_Addr    p_paddr;                /* Segment physical address */
	Elf32_Word    p_filesz;               /* Segment size in file */
	Elf32_Word    p_memsz;                /* Segment size in memory */
	Elf32_Word    p_flags;                /* Segment flags */
	Elf32_Word    p_align;                /* Segment alignment */
} Elf32_Phdr;

// p_type values
#define PT_NULL 		0	/* ignored */
#define PT_LOAD			1	/* loadable segment */
#define PT_DYNAMIC		2	/* dynamic linking info */
#define PT_INTERP		3	/* info about interpreter */
#define PT_NOTE			4	/* note segment */
#define PT_SHLIB		5	/* reserved */
#define PT_PHDR			6	/* Program header table */
#define PT_ARM_ARCHEXT 	0x70000000 /* Platform architecture compatibility information */
#define PT_ARM_EXIDX 	0x70000001 /* Exception unwind tables */

// p_flags value
#define PF_X	1	/* execute */
#define PF_W	2	/* write */
#define PF_R	4	/* read */

// Section header (contains info about section)
typedef struct {
	Elf32_Word    sh_name;                /* Section name (string tbl index) */
	Elf32_Word    sh_type;                /* Section type */
	Elf32_Word    sh_flags;               /* Section flags */
	Elf32_Addr    sh_addr;                /* Section virtual addr at execution */
	Elf32_Off     sh_offset;              /* Section file offset */
	Elf32_Word    sh_size;                /* Section size in bytes */
	Elf32_Word    sh_link;                /* Link to another section */
	Elf32_Word    sh_info;                /* Additional section information */
	Elf32_Word    sh_addralign;           /* Section alignment */
	Elf32_Word    sh_entsize;             /* Entry size if section holds table */
} Elf32_Shdr;

// sh_type values
#define SHT_NULL			0	/* Inactive section */
#define SHT_PROGBITS		1	/* Proprietary */
#define SHT_SYMTAB			2	/* Symbol table */
#define SHT_STRTAB			3	/* String table */
#define SHT_RELA			4	/* Relocation entries with addend */
#define SHT_HASH			5	/* Symbol hash table */
#define SHT_DYNAMIC			6	/* Info for dynamic linking */
#define SHT_NOTE			7	/* Note section */
#define SHT_NOBITS			8	/* Occupies no space */
#define SHT_REL				9	/* Relocation entries without addend */
#define SHT_SHLIB			10	/* Reserved */
#define SHT_DYNSYM			11	/* Minimal set of dynamic linking symbols */
#define SHT_ARM_EXIDX 		0x70000001	/* Exception Index table */
#define SHT_ARM_PREEMPTMAP 	0x70000002	/* BPABI DLL dynamic linking pre-emption map */
#define SHT_ARM_ATTRIBUTES 	0x70000003	/* Object file compatibility attributes */

// sh_flags values
#define SHF_WRITE		0	/* writable section */
#define SHF_ALLOC		2	/* section occupies memory */
#define SHF_EXECINSTR	4	/* machine instructions */

// Symbol entry (contain info about a symbol)
typedef struct {
	Elf32_Word    st_name;                /* Symbol name (string tbl index) */
	Elf32_Addr    st_value;               /* Symbol value */
	Elf32_Word    st_size;                /* Symbol size */
	unsigned char st_info;                /* Symbol type and binding */
	unsigned char st_other;               /* Symbol visibility */
	Elf32_Section st_shndx;               /* Section index */
} Elf32_Sym;

// Extract from the st_info
#define SYM_TYPE(x)		((x)&0xF)
#define SYM_BIND(x)		((x)>>4)

// Symbol binding values from st_info
#define STB_LOCAL 	0	/* Symbol not visible outside object */
#define STB_GLOBAL 	1	/* Symbol visible to all object files */
#define STB_WEAK	2	/* Similar to STB_GLOBAL */

// Symbol type values from st_info
#define STT_NOTYPE	0	/* Not specified */
#define STT_OBJECT	1	/* Data object e.g. variable */
#define STT_FUNC	2	/* Function */
#define STT_SECTION	3	/* Section */
#define STT_FILE	4	/* Source file associated with object file */

// Special section header index values from st_shndex
#define SHN_UNDEF  		0
#define SHN_LOPROC 		0xFF00	/* Extended values */
#define SHN_ABS	   		0xFFF1	/* Absolute value: don't relocate */
#define SHN_COMMON 		0xFFF2	/* Common block. Not allocated yet */
#define SHN_HIPROC 		0xFF1F
#define SHN_HIRESERVE 	0xFFFF

// Relocation entry (info about how to relocate)
typedef struct {
	Elf32_Addr    r_offset;               /* Address */
	Elf32_Word    r_info;                 /* Relocation type and symbol index */
	Elf32_Sword   r_addend;               /* Addend */
} Elf32_Rela;

// Access macros for the relocation info
#define REL_TYPE(x)	((unsigned char) (x))	/* Extract relocation type */
#define REL_INDEX(x)	((x)>>8)		/* Extract relocation index into symbol table */

// ARM relocation types
#define R_ARM_NONE			0
#define R_ARM_PC24			1
#define R_ARM_ABS32			2
#define R_ARM_REL32			3
#define R_ARM_LDR_PC_G0 		4
#define R_ARM_ABS16			5
#define R_ARM_ABS12			6
#define R_ARM_THM_ABS5 			7
#define R_ARM_ABS8			8
#define R_ARM_SBREL32 			9
#define R_ARM_THM_CALL 			10
#define R_ARM_THM_PC8			11
#define R_ARM_BREL_ADJ			12
#define R_ARM_TLS_DESC			13
#define R_ARM_TLS_DTPMOD32		17
#define R_ARM_TLS_DTPOFF32		18
#define R_ARM_TLS_TPOFF32		19
#define R_ARM_COPY			20
#define R_ARM_GLOB_DAT			21
#define R_ARM_JUMP_SLOT			22
#define R_ARM_RELATIVE			23
#define R_ARM_GOTOFF32			24
#define R_ARM_BASE_PREL			25
#define R_ARM_GOT_BREL			26
#define R_ARM_PLT32			27
#define R_ARM_CALL			28
#define R_ARM_JUMP24			29
#define R_ARM_THM_JUMP24		30
#define R_ARM_BASE_ABS			31
#define R_ARM_ALU_PCREL_7_0		32
#define R_ARM_ALU_PCREL_15_8		33
#define R_ARM_ALU_PCREL_23_15		34
#define R_ARM_LDR_SBREL_11_0_NC		35
#define R_ARM_ALU_SBREL_19_12_NC	36
#define R_ARM_ALU_SBREL_27_20_CK	37
#define R_ARM_TARGET1			38
#define R_ARM_SBREL31			39
#define R_ARM_V4BX			40
#define R_ARM_TARGET2			41
#define R_ARM_PREL31			42
#define R_ARM_MOVW_ABS_NC		43
#define R_ARM_MOVT_ABS			44
#define R_ARM_MOVW_PREL_NC		45
#define R_ARM_MOVT_PREL			46
#define R_ARM_THM_MOVW_ABS_NC		47
#define R_ARM_THM_MOVT_ABS		48
#define R_ARM_THM_MOVW_PREL_NC		49
#define R_ARM_THM_MOVT_PREL		50
#define R_ARM_THM_JUMP19		51
#define R_ARM_THM_JUMP6			52
#define R_ARM_THM_ALU_PREL_11_0		53
#define R_ARM_THM_PC12			54
#define R_ARM_ABS32_NOI			55
#define R_ARM_REL32_NOI			56
#define R_ARM_ALU_PC_G0_NC	 	57
#define R_ARM_ALU_PC_G0			58
#define R_ARM_ALU_PC_G1_NC		59
#define R_ARM_ALU_PC_G1			60
#define R_ARM_ALU_PC_G2			61
#define R_ARM_LDR_PC_G1			62
#define R_ARM_LDR_PC_G2			63
#define R_ARM_LDRS_PC_G0		64
#define R_ARM_LDRS_PC_G1		65
#define R_ARM_LDRS_PC_G2		66
#define R_ARM_LDC_PC_G0			67
#define R_ARM_LDC_PC_G1			68
#define R_ARM_LDC_PC_G2			69
#define R_ARM_ALU_SB_G0_NC		70
#define R_ARM_ALU_SB_G0			71
#define R_ARM_ALU_SB_G1_NC		72
#define R_ARM_ALU_SB_G1 		73
#define R_ARM_ALU_SB_G2			74
#define R_ARM_LDR_SB_G0			75
#define R_ARM_LDR_SB_G1			76
#define R_ARM_LDR_SB_G2			77
#define R_ARM_LDRS_SB_G0		78
#define R_ARM_LDRS_SB_G1		79
#define R_ARM_LDRS_SB_G2		80
#define R_ARM_LDC_SB_G0			81
#define R_ARM_LDC_SB_G1			82
#define R_ARM_LDC_SB_G2			83
#define R_ARM_MOVW_BREL_NC		84
#define R_ARM_MOVT_BREL			85
#define R_ARM_MOVW_BREL			86
#define R_ARM_THM_MOVW_BREL_NC		87
#define R_ARM_THM_MOVT_BREL		88
#define R_ARM_THM_MOVW_BREL		89
#define R_ARM_TLS_GOTDESC		90
#define R_ARM_TLS_CALL			91
#define R_ARM_TLS_DESCSEQ		92
#define R_ARM_THM_TLS_CALL		93
#define R_ARM_PLT32_ABS			94
#define R_ARM_GOT_ABS			95
#define R_ARM_GOT_PREL			96
#define R_ARM_GOT_BREL12		97
#define R_ARM_GOTOFF12			98
#define R_ARM_GOTRELAX			99
#define R_ARM_THM_JUMP11		102
#define R_ARM_THM_JUMP8			103
#define R_ARM_TLS_GD32			104
#define R_ARM_TLS_LDM32			105
#define R_ARM_TLS_LDO32			106
#define R_ARM_TLS_IE32			107
#define R_ARM_TLS_LE32			108
#define R_ARM_TLS_LDO12			109
#define R_ARM_TLS_LE12			110
#define R_ARM_TLS_IE12GP		111
#define R_ARM_PRIVATE_0			112
#define R_ARM_PRIVATE_1			113
#define R_ARM_PRIVATE_2			114
#define R_ARM_PRIVATE_3			115
#define R_ARM_PRIVATE_4			116
#define R_ARM_PRIVATE_5			117
#define R_ARM_PRIVATE_6			118
#define R_ARM_PRIVATE_7			119
#define R_ARM_PRIVATE_8			120
#define R_ARM_PRIVATE_9			121
#define R_ARM_PRIVATE_10		122
#define R_ARM_PRIVATE_11		123
#define R_ARM_PRIVATE_12		124
#define R_ARM_PRIVATE_13		125
#define R_ARM_PRIVATE_14		126
#define R_ARM_PRIVATE_15		127
#define R_ARM_THM_TLS_DESCSEQ16         129
#define R_ARM_THM_TLS_DESCSEQ32 	130

#endif /* BACKENDS_ELF_H */