]> pd.if.org Git - zpackage/blob - elf/elf.h
rework zpm-add
[zpackage] / elf / elf.h
1 #ifndef ELF_H_
2 #define ELF_H_ 1
3
4 #include <stdint.h>
5
6 typedef uint32_t Elf32_Addr;
7 typedef uint32_t Elf32_Off;
8 typedef uint16_t Elf32_Half;
9 typedef uint32_t Elf32_Word;
10 typedef int32_t Elf32_Sword;
11
12 typedef uint64_t Elf64_Addr;
13 typedef uint64_t Elf64_Off;
14 typedef uint16_t Elf64_Half;
15 typedef uint32_t Elf64_Word;
16 typedef int32_t Elf64_Sword;
17 typedef uint64_t Elf64_Xword;
18 typedef int64_t Elf64_Sxword;
19
20 #define EI_NIDENT 16
21
22 typedef struct {
23         unsigned char   e_ident[EI_NIDENT];
24         Elf32_Half      e_type;
25         Elf32_Half      e_machine;
26         Elf32_Word      e_version;
27         Elf32_Addr      e_entry;
28         Elf32_Off       e_phoff;
29         Elf32_Off       e_shoff;
30         Elf32_Word      e_flags;
31         Elf32_Half      e_ehsize;
32         Elf32_Half      e_phentsize;
33         Elf32_Half      e_phnum;
34         Elf32_Half      e_shentsize;
35         Elf32_Half      e_shnum;
36         Elf32_Half      e_shstrndx;
37 } Elf32_Ehdr;
38
39 typedef struct {
40         unsigned char   e_ident[EI_NIDENT];
41         Elf64_Half      e_type;
42         Elf64_Half      e_machine;
43         Elf64_Word      e_version;
44         Elf64_Addr      e_entry;
45         Elf64_Off       e_phoff;
46         Elf64_Off       e_shoff;
47         Elf64_Word      e_flags;
48         Elf64_Half      e_ehsize;
49         Elf64_Half      e_phentsize;
50         Elf64_Half      e_phnum;
51         Elf64_Half      e_shentsize;
52         Elf64_Half      e_shnum;
53         Elf64_Half      e_shstrndx;
54 } Elf64_Ehdr;
55
56
57 typedef struct {
58         Elf32_Word      sh_name;
59         Elf32_Word      sh_type;
60         Elf32_Word      sh_flags;
61         Elf32_Addr      sh_addr;
62         Elf32_Off       sh_offset;
63         Elf32_Word      sh_size;
64         Elf32_Word      sh_link;
65         Elf32_Word      sh_info;
66         Elf32_Word      sh_addralign;
67         Elf32_Word      sh_entsize;
68 } Elf32_Shdr;
69
70 typedef struct {
71         Elf64_Word      sh_name;
72         Elf64_Word      sh_type;
73         Elf64_Xword     sh_flags;
74         Elf64_Addr      sh_addr;
75         Elf64_Off       sh_offset;
76         Elf64_Xword     sh_size;
77         Elf64_Word      sh_link;
78         Elf64_Word      sh_info;
79         Elf64_Xword     sh_addralign;
80         Elf64_Xword     sh_entsize;
81 } Elf64_Shdr;
82
83 typedef struct {
84         Elf64_Word      p_type; 
85         Elf64_Word      p_flags;
86         Elf64_Off       p_offset;
87         Elf64_Addr      p_vaddr;
88         Elf64_Addr      p_paddr;
89         Elf64_Xword     p_filesz;
90         Elf64_Xword     p_memsz;
91         Elf64_Xword     p_align;
92 } Elf64_Phdr;
93
94 #define PT_NULL         0
95 #define PT_LOAD         1
96 #define PT_DYNAMIC      2
97 #define PT_INTERP       3
98 #define PT_NOTE         4
99 #define PT_SHLIB        5
100 #define PT_PHDR         6
101 #define PT_TLS          7
102 #define PT_NUM          8
103 #define PT_LOOS         0x60000000
104 #define PT_HIOS         0x6fffffff
105 #define PT_LOPROC       0x70000000
106 #define PT_HIPROC       0x7fffffff
107
108 typedef struct {
109         Elf32_Word      ch_type;
110         Elf32_Word      ch_size;
111         Elf32_Word      ch_addralign;
112 } Elf32_Chdr;
113
114 typedef struct {
115         Elf64_Word      ch_type;
116         Elf64_Word      ch_reserved;
117         Elf64_Xword     ch_size;
118         Elf64_Xword     ch_addralign;
119 } Elf64_Chdr;
120
121 typedef struct {
122         Elf32_Word      st_name;
123         Elf32_Addr      st_value;
124         Elf32_Word      st_size;
125         unsigned char   st_info;
126         unsigned char   st_other;
127         Elf32_Half      st_shndx;
128 } Elf32_Sym;
129
130 typedef struct {
131         Elf64_Word      st_name;
132         unsigned char   st_info;
133         unsigned char   st_other;
134         Elf64_Half      st_shndx;
135         Elf64_Addr      st_value;
136         Elf64_Xword     st_size;
137 } Elf64_Sym;
138
139
140 typedef struct {
141         Elf32_Addr      r_offset;
142         Elf32_Word      r_info;
143 } Elf32_Rel;
144
145 typedef struct {
146         Elf32_Addr      r_offset;
147         Elf32_Word      r_info;
148         Elf32_Sword     r_addend;
149 } Elf32_Rela;
150
151 typedef struct {
152         Elf64_Addr      r_offset;
153         Elf64_Xword     r_info;
154 } Elf64_Rel;
155
156 typedef struct {
157         Elf64_Addr      r_offset;
158         Elf64_Xword     r_info;
159         Elf64_Sxword    r_addend;
160 } Elf64_Rela;
161
162 typedef struct {
163         Elf32_Sword     d_tag;
164         union {
165                 Elf32_Word      d_val;
166                 Elf32_Addr      d_ptr;
167         } d_un;
168 } Elf32_Dyn;
169
170 /* extern Elf32_Dyn     _DYNAMIC[]; */
171
172 typedef struct {
173         Elf64_Sxword    d_tag;
174         union {
175                 Elf64_Xword     d_val;
176                 Elf64_Addr      d_ptr;
177         } d_un;
178 } Elf64_Dyn;
179
180 /* extern Elf64_Dyn     _DYNAMIC[]; */
181
182 #define DT_NULL 0
183 #define DT_NEEDED 1
184 #define DT_PLTRELSZ 2
185 #define DT_PLTGOT 3
186 #define DT_HASH 4
187 #define DT_STRTAB 5
188 #define DT_SYMTAB 6
189 #define DT_RELA 7
190 #define DT_RELASZ 8
191 #define DT_RELAENT 9
192 #define DT_STRSZ 10
193 #define DT_SYMENT 11
194 #define DT_INIT 12
195 #define DT_FINI 13
196 #define DT_SONAME 14
197 #define DT_RPATH 15
198 #define DT_SYMBOLIC 16
199 #define DT_REL 17
200 #define DT_RELSZ 18
201 #define DT_RELENT 19
202 #define DT_PLTREL 20
203 #define DT_DEBUG 21
204 #define DT_TEXTREL 22
205 #define DT_JMPREL 23
206 #define DT_BIND_NOW 24
207 #define DT_INIT_ARRAY 25
208 #define DT_FINI_ARRAY 26
209 #define DT_INIT_ARRAYSZ 27
210 #define DT_FINI_ARRAYSZ 28
211 #define DT_RUNPATH 29
212 #define DT_FLAGS 30
213 #define DT_ENCODING 32
214 #define DT_PREINIT_ARRAY 32
215 #define DT_PREINIT_ARRAYSZ 33
216 #define DT_SYMTAB_SHNDX 34
217 #define DT_LOOS 0x6000000D
218 #define DT_HIOS 0x6ffff000
219 #define DT_LOPROC 0x70000000
220 #define DT_HIPROC 0x7fffffff
221
222 #define DF_ORIGIN       0x1
223 #define DF_SYMBOLIC     0x2
224 #define DF_TEXTREL      0x4
225 #define DF_BIND_NOW     0x8
226 #define DF_STATIC_TLS   0x10
227
228 #define ELF32_R_SYM(i)  ((i)>>8)
229 #define ELF32_R_TYPE(i)   ((unsigned char)(i))
230 #define ELF32_R_INFO(s,t) (((s)<<8)+(unsigned char)(t))
231
232 #define ELF64_R_SYM(i)    ((i)>>32)
233 #define ELF64_R_TYPE(i)   ((i)&0xffffffffL)
234 #define ELF64_R_INFO(s,t) (((s)<<32)+((t)&0xffffffffL))
235
236 #define ELF32_ST_BIND(i)   ((i)>>4)
237 #define ELF32_ST_TYPE(i)   ((i)&0xf)
238 #define ELF32_ST_INFO(b,t) (((b)<<4)+((t)&0xf))
239
240 #define ELF64_ST_BIND(i)   ((i)>>4)
241 #define ELF64_ST_TYPE(i)   ((i)&0xf)
242 #define ELF64_ST_INFO(b,t) (((b)<<4)+((t)&0xf))
243
244 #define ELF32_ST_VISIBILITY(o) ((o)&0x3)
245 #define ELF64_ST_VISIBILITY(o) ((o)&0x3)
246
247 #define STB_GLOBAL      1
248 #define STB_WEAK        2
249 #define STB_LOOS        10
250 #define STB_HIOS        12
251 #define STB_LOPROC      13
252 #define STB_HIPROC      15
253
254 #define STT_NOTYPE      0
255 #define STT_OBJECT      1
256 #define STT_FUNC        2
257 #define STT_SECTION     3
258 #define STT_FILE        4
259 #define STT_COMMON      5
260 #define STT_TLS 6
261 #define STT_LOOS        10
262 #define STT_HIOS        12
263 #define STT_LOPROC      13
264 #define STT_HIPROC      15
265
266 #define STV_DEFAULT     0
267 #define STV_INTERNAL    1
268 #define STV_HIDDEN      2
269 #define STV_PROTECTED   3
270
271 #define GRP_COMDAT      0x1
272 #define GRP_MASKOS      0x0ff00000
273 #define GRP_MASKPROC    0xf0000000
274
275 #define ELFCOMPRESS_ZLIB        1
276 #define ELFCOMPRESS_LOOS        0x60000000
277 #define ELFCOMPRESS_HIOS        0x6fffffff
278 #define ELFCOMPRESS_LOPROC      0x70000000
279 #define ELFCOMPRESS_HIPROC      0x7fffffff
280
281 #define SHT_NULL        0
282 #define SHT_PROGBITS    1
283 #define SHT_SYMTAB      2
284 #define SHT_STRTAB      3
285 #define SHT_RELA        4
286 #define SHT_HASH        5
287 #define SHT_DYNAMIC     6
288 #define SHT_NOTE        7
289 #define SHT_NOBITS      8
290 #define SHT_REL 9
291 #define SHT_SHLIB       10
292 #define SHT_DYNSYM      11
293 #define SHT_INIT_ARRAY  14
294 #define SHT_FINI_ARRAY  15
295 #define SHT_PREINIT_ARRAY       16
296 #define SHT_GROUP       17
297 #define SHT_SYMTAB_SHNDX        18
298 #define SHT_LOOS        0x60000000
299 #define SHT_HIOS        0x6fffffff
300 #define SHT_LOPROC      0x70000000
301 #define SHT_HIPROC      0x7fffffff
302 #define SHT_LOUSER      0x80000000
303 #define SHT_HIUSER      0xffffffff
304
305 #define SHF_WRITE       0x1
306 #define SHF_ALLOC       0x2
307 #define SHF_EXECINSTR   0x4
308 #define SHF_MERGE       0x10
309 #define SHF_STRINGS     0x20
310 #define SHF_INFO_LINK   0x40
311 #define SHF_LINK_ORDER  0x80
312 #define SHF_OS_NONCONFORMING    0x100
313 #define SHF_GROUP       0x200
314 #define SHF_TLS 0x400
315 #define SHF_COMPRESSED  0x800
316 #define SHF_MASKOS      0x0ff00000
317 #define SHF_MASKPROC    0xf0000000
318
319 #define SHN_UNDEF       0
320 #define SHN_LORESERVE   0xff00
321 #define SHN_LOPROC      0xff00
322 #define SHN_HIPROC      0xff1f
323 #define SHN_LOOS        0xff20
324 #define SHN_HIOS        0xff3f
325 #define SHN_ABS 0xfff1
326 #define SHN_COMMON      0xfff2
327 #define SHN_XINDEX      0xffff
328 #define SHN_HIRESERVE   0xffff
329
330 #define ET_NONE 0
331 #define ET_REL 1
332 #define ET_EXEC 2
333 #define ET_DYN 3
334 #define ET_CORE 4
335 #define ET_LOOS 0xfe00
336 #define ET_HIOS 0xfeff
337 #define ET_LOPROC 0xff00
338 #define ET_HIPROC 0xffff
339
340 #define EM_NONE 0
341 #define EM_M32 1
342 #define EM_SPARC 2
343 #define EM_386 3
344 #define EM_68K 4
345 #define EM_88K 5
346 #define EM_IAMCU 6
347 #define EM_860 7
348 #define EM_MIPS 8
349 #define EM_S370 9
350 #define EM_MIPS_RS3_LE 10
351 #define EM_PARISC 15
352 #define EM_VPP500 17
353 #define EM_SPARC32PLUS 18
354 #define EM_960 19
355 #define EM_PPC 20
356 #define EM_PPC64 21
357 #define EM_S390 22
358 #define EM_SPU 23
359 #define EM_V800 36
360 #define EM_FR20 37
361 #define EM_RH32 38
362 #define EM_RCE 39
363 #define EM_ARM 40
364 #define EM_ALPHA 41
365 #define EM_SH 42
366 #define EM_SPARCV9 43
367 #define EM_TRICORE 44
368 #define EM_ARC 45
369 #define EM_H8_300 46
370 #define EM_H8_300H 47
371 #define EM_H8S 48
372 #define EM_H8_500 49
373 #define EM_IA_64 50
374 #define EM_MIPS_X 51
375 #define EM_COLDFIRE 52
376 #define EM_68HC12 53
377 #define EM_MMA 54
378 #define EM_PCP 55
379 #define EM_NCPU 56
380 #define EM_NDR1 57
381 #define EM_STARCORE 58
382 #define EM_ME16 59
383 #define EM_ST100 60
384 #define EM_TINYJ 61
385 #define EM_X86_64 62
386 #define EM_PDSP 63
387 #define EM_PDP10 64
388 #define EM_PDP11 65
389 #define EM_FX66 66
390 #define EM_ST9PLUS 67
391 #define EM_ST7 68
392 #define EM_68HC16 69
393 #define EM_68HC11 70
394 #define EM_68HC08 71
395 #define EM_68HC05 72
396 #define EM_SVX 73
397 #define EM_ST19 74
398 #define EM_VAX 75
399 #define EM_CRIS 76
400 #define EM_JAVELIN 77
401 #define EM_FIREPATH 78
402 #define EM_ZSP 79
403 #define EM_MMIX 80
404 #define EM_HUANY 81
405 #define EM_PRISM 82
406 #define EM_AVR 83
407 #define EM_FR30 84
408 #define EM_D10V 85
409 #define EM_D30V 86
410 #define EM_V850 87
411 #define EM_M32R 88
412 #define EM_MN10300 89
413 #define EM_MN10200 90
414 #define EM_PJ 91
415 #define EM_OPENRISC 92
416 #define EM_ARC_COMPACT 93
417 #define EM_XTENSA 94
418 #define EM_VIDEOCORE 95
419 #define EM_TMM_GPP 96
420 #define EM_NS32K 97
421 #define EM_TPC 98
422 #define EM_SNP1K 99
423 #define EM_ST200 100
424 #define EM_IP2K 101
425 #define EM_MAX 102
426 #define EM_CR 103
427 #define EM_F2MC16 104
428 #define EM_MSP430 105
429 #define EM_BLACKFIN 106
430 #define EM_SE_C33 107
431 #define EM_SEP 108
432 #define EM_ARCA 109
433 #define EM_UNICORE 110
434 #define EM_EXCESS 111
435 #define EM_DXP 112
436 #define EM_ALTERA_NIOS2 113
437 #define EM_CRX 114
438 #define EM_XGATE 115
439 #define EM_C166 116
440 #define EM_M16C 117
441 #define EM_DSPIC30F 118
442 #define EM_CE 119
443 #define EM_M32C 120
444 #define EM_TSK3000 131
445 #define EM_RS08 132
446 #define EM_SHARC 133
447 #define EM_ECOG2 134
448 #define EM_SCORE7 135
449 #define EM_DSP24 136
450 #define EM_VIDEOCORE3 137
451 #define EM_LATTICEMICO32 138
452 #define EM_SE_C17 139
453 #define EM_TI_C6000 140
454 #define EM_TI_C2000 141
455 #define EM_TI_C5500 142
456 #define EM_TI_ARP32 143
457 #define EM_TI_PRU 144
458 #define EM_MMDSP_PLUS 160
459 #define EM_MMDSP_PLUS 160
460 #define EM_CYPRESS_M8C 161
461 #define EM_R32C 162
462 #define EM_TRIMEDIA 163
463 #define EM_QDSP6 164
464 #define EM_8051 165
465 #define EM_STXP7X 166
466 #define EM_NDS32 167
467 #define EM_ECOG1 168
468 #define EM_ECOG1X 168
469 #define EM_MAXQ30 169
470 #define EM_XIMO16 170
471 #define EM_MANIK 171
472 #define EM_CRAYNV2 172
473 #define EM_RX 173
474 #define EM_METAG 174
475 #define EM_MCST_ELBRUS 175
476 #define EM_ECOG16 176
477 #define EM_CR16 177
478 #define EM_ETPU 178
479 #define EM_SLE9X 179
480 #define EM_L10M 180
481 #define EM_K10M 181
482 #define EM_AARCH64      183
483 #define EM_AVR32        185
484 #define EM_STM8 186
485 #define EM_TILE64       187
486 #define EM_TILEPRO      188
487 #define EM_MICROBLAZE   189
488 #define EM_CUDA 190
489 #define EM_TILEGX       191
490 #define EM_CLOUDSHIELD  192
491 #define EM_COREA_1ST    193
492 #define EM_COREA_2ND    194
493 #define EM_ARC_COMPACT2 195
494 #define EM_OPEN8        196
495 #define EM_RL78 197
496 #define EM_VIDEOCORE5   198
497 #define EM_78KOR        199
498 #define EM_56800EX      200
499 #define EM_BA1  201
500 #define EM_BA2  202
501 #define EM_XCORE        203
502 #define EM_MCHP_PIC     204
503 #define EM_INTEL205     205
504 #define EM_INTEL206     206
505 #define EM_INTEL207     207
506 #define EM_INTEL208     208
507 #define EM_INTEL209     209
508 #define EM_KM32 210
509 #define EM_KMX32        211
510 #define EM_KMX16        212
511 #define EM_KMX8 213
512 #define EM_KVARC        214
513 #define EM_CDP  215
514 #define EM_COGE 216
515 #define EM_COOL 217
516 #define EM_NORC 218
517 #define EM_CSR_KALIMBA  219
518 #define EM_Z80  220
519 #define EM_VISIUM       221
520 #define EM_FT32 222
521 #define EM_MOXIE        223
522 #define EM_AMDGPU       224
523 #define EM_RISCV        243
524
525 #define EV_NONE 0
526 #define EV_CURRENT      1
527
528 #define EI_MAG0 0
529 #define EI_MAG1 1
530 #define EI_MAG2 2
531 #define EI_MAG3 3
532 #define EI_CLASS        4
533 #define EI_DATA 5
534 #define EI_VERSION      6
535 #define EI_OSABI        7
536 #define EI_ABIVERSION   8
537 #define EI_PAD  9
538 #define EI_NIDENT       16
539
540 #define ELFMAG0 0x7f
541 #define ELFMAG1 'E'
542 #define ELFMAG2 'L'
543 #define ELFMAG3 'F'
544
545 #define ELFCLASSNONE    0
546 #define ELFCLASS32      1
547 #define ELFCLASS64      2
548
549 #define ELFDATANONE     0
550 #define ELFDATA2LSB     1
551 #define ELFDATA2MSB     2
552
553 #define ELFOSABI_NONE   0
554 #define ELFOSABI_HPUX   1
555 #define ELFOSABI_NETBSD 2
556 #define ELFOSABI_GNU    3
557 #define ELFOSABI_LINUX 3
558 #define ELFOSABI_SOLARIS        6
559 #define ELFOSABI_AIX    7
560 #define ELFOSABI_IRIX   8
561 #define ELFOSABI_FREEBSD        9
562 #define ELFOSABI_TRU64  10
563 #define ELFOSABI_MODESTO        11
564 #define ELFOSABI_OPENBSD        12
565 #define ELFOSABI_OPENVMS        13
566 #define ELFOSABI_NSK    14
567 #define ELFOSABI_AROS   15
568 #define ELFOSABI_FENIXOS        16
569 #define ELFOSABI_CLOUDABI       17
570 #define ELFOSABI_OPENVOS        18
571
572 /* libelf.c */
573 Elf64_Ehdr *libelf_header(void *elf);
574 Elf64_Shdr *libelf_shdr(void *elf, int n);
575 Elf64_Shdr *libelf_sht_strtab(void *elf);
576 char *libelf_sectionname(Elf64_Shdr *section, Elf64_Shdr *strtab);
577 Elf64_Shdr *libelf_section_n(void *elf, int n);
578 Elf64_Shdr *libelf_section(void *elf, unsigned int type);
579 int libelf_type(void *elf);
580 int libelf_iself(void *elf);
581 char *libelf_soname(void *elf);
582
583 #endif