|
1 /* |
|
2 * elf_repl.h - public header file for systems that lack it. |
|
3 * Copyright (C) 1995 - 2006 Michael Riepe |
|
4 * |
|
5 * This library is free software; you can redistribute it and/or |
|
6 * modify it under the terms of the GNU Library General Public |
|
7 * License as published by the Free Software Foundation; either |
|
8 * version 2 of the License, or (at your option) any later version. |
|
9 * |
|
10 * This library is distributed in the hope that it will be useful, |
|
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|
13 * Library General Public License for more details. |
|
14 * |
|
15 * You should have received a copy of the GNU Library General Public |
|
16 * License along with this library; if not, write to the Free Software |
|
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
|
18 */ |
|
19 |
|
20 /* @(#) $Id: elf_repl.h,v 1.20 2006/07/07 22:16:15 michael Exp $ */ |
|
21 |
|
22 /* |
|
23 * NEVER INCLUDE THIS FILE DIRECTLY - USE <libelf.h> INSTEAD! |
|
24 */ |
|
25 |
|
26 #ifndef _ELF_REPL_H |
|
27 #define _ELF_REPL_H |
|
28 |
|
29 #ifdef __cplusplus |
|
30 extern "C" { |
|
31 #endif /* __cplusplus */ |
|
32 |
|
33 /* |
|
34 * Scalar data types |
|
35 */ |
|
36 typedef __libelf_u32_t Elf32_Addr; |
|
37 typedef __libelf_u16_t Elf32_Half; |
|
38 typedef __libelf_u32_t Elf32_Off; |
|
39 typedef __libelf_i32_t Elf32_Sword; |
|
40 typedef __libelf_u32_t Elf32_Word; |
|
41 |
|
42 #define ELF32_FSZ_ADDR 4 |
|
43 #define ELF32_FSZ_HALF 2 |
|
44 #define ELF32_FSZ_OFF 4 |
|
45 #define ELF32_FSZ_SWORD 4 |
|
46 #define ELF32_FSZ_WORD 4 |
|
47 |
|
48 #if __LIBELF64 |
|
49 |
|
50 typedef __libelf_u64_t Elf64_Addr; |
|
51 typedef __libelf_u16_t Elf64_Half; |
|
52 typedef __libelf_u64_t Elf64_Off; |
|
53 typedef __libelf_i32_t Elf64_Sword; |
|
54 typedef __libelf_u32_t Elf64_Word; |
|
55 typedef __libelf_i64_t Elf64_Sxword; |
|
56 typedef __libelf_u64_t Elf64_Xword; |
|
57 |
|
58 #define ELF64_FSZ_ADDR 8 |
|
59 #define ELF64_FSZ_HALF 2 |
|
60 #define ELF64_FSZ_OFF 8 |
|
61 #define ELF64_FSZ_SWORD 4 |
|
62 #define ELF64_FSZ_WORD 4 |
|
63 #define ELF64_FSZ_SXWORD 8 |
|
64 #define ELF64_FSZ_XWORD 8 |
|
65 |
|
66 /* |
|
67 * Blame Sun for this... |
|
68 */ |
|
69 typedef __libelf_u64_t Elf64_Lword; |
|
70 typedef __libelf_u64_t Elf32_Lword; |
|
71 |
|
72 #endif /* __LIBELF64 */ |
|
73 |
|
74 /* |
|
75 * ELF header |
|
76 */ |
|
77 #define EI_NIDENT 16 |
|
78 |
|
79 typedef struct { |
|
80 unsigned char e_ident[EI_NIDENT]; |
|
81 Elf32_Half e_type; |
|
82 Elf32_Half e_machine; |
|
83 Elf32_Word e_version; |
|
84 Elf32_Addr e_entry; |
|
85 Elf32_Off e_phoff; |
|
86 Elf32_Off e_shoff; |
|
87 Elf32_Word e_flags; |
|
88 Elf32_Half e_ehsize; |
|
89 Elf32_Half e_phentsize; |
|
90 Elf32_Half e_phnum; |
|
91 Elf32_Half e_shentsize; |
|
92 Elf32_Half e_shnum; |
|
93 Elf32_Half e_shstrndx; |
|
94 } Elf32_Ehdr; |
|
95 |
|
96 #if __LIBELF64 |
|
97 typedef struct { |
|
98 unsigned char e_ident[EI_NIDENT]; |
|
99 Elf64_Half e_type; |
|
100 Elf64_Half e_machine; |
|
101 Elf64_Word e_version; |
|
102 Elf64_Addr e_entry; |
|
103 Elf64_Off e_phoff; |
|
104 Elf64_Off e_shoff; |
|
105 Elf64_Word e_flags; |
|
106 Elf64_Half e_ehsize; |
|
107 Elf64_Half e_phentsize; |
|
108 Elf64_Half e_phnum; |
|
109 Elf64_Half e_shentsize; |
|
110 Elf64_Half e_shnum; |
|
111 Elf64_Half e_shstrndx; |
|
112 } Elf64_Ehdr; |
|
113 #endif /* __LIBELF64 */ |
|
114 |
|
115 /* |
|
116 * e_ident |
|
117 */ |
|
118 #define EI_MAG0 0 |
|
119 #define EI_MAG1 1 |
|
120 #define EI_MAG2 2 |
|
121 #define EI_MAG3 3 |
|
122 #define EI_CLASS 4 |
|
123 #define EI_DATA 5 |
|
124 #define EI_VERSION 6 |
|
125 #define EI_OSABI 7 |
|
126 #define EI_ABIVERSION 8 |
|
127 #define EI_PAD 9 |
|
128 |
|
129 #define ELFMAG0 0x7f |
|
130 #define ELFMAG1 'E' |
|
131 #define ELFMAG2 'L' |
|
132 #define ELFMAG3 'F' |
|
133 #define ELFMAG "\177ELF" |
|
134 #define SELFMAG 4 |
|
135 |
|
136 /* |
|
137 * e_ident[EI_CLASS] |
|
138 */ |
|
139 #define ELFCLASSNONE 0 |
|
140 #define ELFCLASS32 1 |
|
141 #define ELFCLASS64 2 |
|
142 #define ELFCLASSNUM 3 |
|
143 |
|
144 /* |
|
145 * e_ident[EI_DATA] |
|
146 */ |
|
147 #define ELFDATANONE 0 |
|
148 #define ELFDATA2LSB 1 |
|
149 #define ELFDATA2MSB 2 |
|
150 #define ELFDATANUM 3 |
|
151 |
|
152 /* |
|
153 * e_ident[EI_OSABI] |
|
154 */ |
|
155 #define ELFOSABI_NONE 0 /* No extensions or unspecified */ |
|
156 #define ELFOSABI_SYSV ELFOSABI_NONE |
|
157 #define ELFOSABI_HPUX 1 /* Hewlett-Packard HP-UX */ |
|
158 #define ELFOSABI_NETBSD 2 /* NetBSD */ |
|
159 #define ELFOSABI_LINUX 3 /* Linux */ |
|
160 #define ELFOSABI_SOLARIS 6 /* Sun Solaris */ |
|
161 #define ELFOSABI_AIX 7 /* AIX */ |
|
162 #define ELFOSABI_IRIX 8 /* IRIX */ |
|
163 #define ELFOSABI_FREEBSD 9 /* FreeBSD */ |
|
164 #define ELFOSABI_TRU64 10 /* Compaq TRU64 UNIX */ |
|
165 #define ELFOSABI_MODESTO 11 /* Novell Modesto */ |
|
166 #define ELFOSABI_OPENBSD 12 /* Open BSD */ |
|
167 #define ELFOSABI_OPENVMS 13 /* Open VMS */ |
|
168 #define ELFOSABI_NSK 14 /* Hewlett-Packard Non-Stop Kernel */ |
|
169 #define ELFOSABI_AROS 15 /* Amiga Research OS */ |
|
170 /* these are probably obsolete: */ |
|
171 #define ELFOSABI_ARM 97 /* ARM */ |
|
172 #define ELFOSABI_STANDALONE 255 /* standalone (embedded) application */ |
|
173 |
|
174 |
|
175 /* |
|
176 * e_type |
|
177 */ |
|
178 #define ET_NONE 0 |
|
179 #define ET_REL 1 |
|
180 #define ET_EXEC 2 |
|
181 #define ET_DYN 3 |
|
182 #define ET_CORE 4 |
|
183 #define ET_NUM 5 |
|
184 #define ET_LOOS 0xfe00 |
|
185 #define ET_HIOS 0xfeff |
|
186 #define ET_LOPROC 0xff00 |
|
187 #define ET_HIPROC 0xffff |
|
188 |
|
189 /* |
|
190 * e_machine |
|
191 */ |
|
192 #define EM_NONE 0 /* No machine */ |
|
193 #define EM_M32 1 /* AT&T WE 32100 */ |
|
194 #define EM_SPARC 2 /* SPARC */ |
|
195 #define EM_386 3 /* Intel 80386 */ |
|
196 #define EM_68K 4 /* Motorola 68000 */ |
|
197 #define EM_88K 5 /* Motorola 88000 */ |
|
198 #define EM_486 6 /* Intel i486 (DO NOT USE THIS ONE) */ |
|
199 #define EM_860 7 /* Intel 80860 */ |
|
200 #define EM_MIPS 8 /* MIPS I Architecture */ |
|
201 #define EM_S370 9 /* IBM System/370 Processor */ |
|
202 #define EM_MIPS_RS3_LE 10 /* MIPS RS3000 Little-endian */ |
|
203 #define EM_SPARC64 11 /* SPARC 64-bit */ |
|
204 #define EM_PARISC 15 /* Hewlett-Packard PA-RISC */ |
|
205 #define EM_VPP500 17 /* Fujitsu VPP500 */ |
|
206 #define EM_SPARC32PLUS 18 /* Enhanced instruction set SPARC */ |
|
207 #define EM_960 19 /* Intel 80960 */ |
|
208 #define EM_PPC 20 /* PowerPC */ |
|
209 #define EM_PPC64 21 /* 64-bit PowerPC */ |
|
210 #define EM_S390 22 /* IBM System/390 Processor */ |
|
211 #define EM_V800 36 /* NEC V800 */ |
|
212 #define EM_FR20 37 /* Fujitsu FR20 */ |
|
213 #define EM_RH32 38 /* TRW RH-32 */ |
|
214 #define EM_RCE 39 /* Motorola RCE */ |
|
215 #define EM_ARM 40 /* Advanced RISC Machines ARM */ |
|
216 #define EM_ALPHA 41 /* Digital Alpha */ |
|
217 #define EM_SH 42 /* Hitachi SH */ |
|
218 #define EM_SPARCV9 43 /* SPARC Version 9 */ |
|
219 #define EM_TRICORE 44 /* Siemens TriCore embedded processor */ |
|
220 #define EM_ARC 45 /* Argonaut RISC Core, Argonaut Technologies Inc. */ |
|
221 #define EM_H8_300 46 /* Hitachi H8/300 */ |
|
222 #define EM_H8_300H 47 /* Hitachi H8/300H */ |
|
223 #define EM_H8S 48 /* Hitachi H8S */ |
|
224 #define EM_H8_500 49 /* Hitachi H8/500 */ |
|
225 #define EM_IA_64 50 /* Intel IA-64 processor architecture */ |
|
226 #define EM_MIPS_X 51 /* Stanford MIPS-X */ |
|
227 #define EM_COLDFIRE 52 /* Motorola ColdFire */ |
|
228 #define EM_68HC12 53 /* Motorola M68HC12 */ |
|
229 #define EM_MMA 54 /* Fujitsu MMA Multimedia Accelerator */ |
|
230 #define EM_PCP 55 /* Siemens PCP */ |
|
231 #define EM_NCPU 56 /* Sony nCPU embedded RISC processor */ |
|
232 #define EM_NDR1 57 /* Denso NDR1 microprocessor */ |
|
233 #define EM_STARCORE 58 /* Motorola Star*Core processor */ |
|
234 #define EM_ME16 59 /* Toyota ME16 processor */ |
|
235 #define EM_ST100 60 /* STMicroelectronics ST100 processor */ |
|
236 #define EM_TINYJ 61 /* Advanced Logic Corp. TinyJ embedded processor family */ |
|
237 #define EM_X86_64 62 /* AMD x86-64 architecture */ |
|
238 #define EM_AMD64 EM_X86_64 |
|
239 #define EM_PDSP 63 /* Sony DSP Processor */ |
|
240 #define EM_FX66 66 /* Siemens FX66 microcontroller */ |
|
241 #define EM_ST9PLUS 67 /* STMicroelectronics ST9+ 8/16 bit microcontroller */ |
|
242 #define EM_ST7 68 /* STMicroelectronics ST7 8-bit microcontroller */ |
|
243 #define EM_68HC16 69 /* Motorola MC68HC16 Microcontroller */ |
|
244 #define EM_68HC11 70 /* Motorola MC68HC11 Microcontroller */ |
|
245 #define EM_68HC08 71 /* Motorola MC68HC08 Microcontroller */ |
|
246 #define EM_68HC05 72 /* Motorola MC68HC05 Microcontroller */ |
|
247 #define EM_SVX 73 /* Silicon Graphics SVx */ |
|
248 #define EM_ST19 74 /* STMicroelectronics ST19 8-bit microcontroller */ |
|
249 #define EM_VAX 75 /* Digital VAX */ |
|
250 #define EM_CRIS 76 /* Axis Communications 32-bit embedded processor */ |
|
251 #define EM_JAVELIN 77 /* Infineon Technologies 32-bit embedded processor */ |
|
252 #define EM_FIREPATH 78 /* Element 14 64-bit DSP Processor */ |
|
253 #define EM_ZSP 79 /* LSI Logic 16-bit DSP Processor */ |
|
254 #define EM_MMIX 80 /* Donald Knuth's educational 64-bit processor */ |
|
255 #define EM_HUANY 81 /* Harvard University machine-independent object files */ |
|
256 #define EM_PRISM 82 /* SiTera Prism */ |
|
257 #define EM_AVR 83 /* Atmel AVR 8-bit microcontroller */ |
|
258 #define EM_FR30 84 /* Fujitsu FR30 */ |
|
259 #define EM_D10V 85 /* Mitsubishi D10V */ |
|
260 #define EM_D30V 86 /* Mitsubishi D30V */ |
|
261 #define EM_V850 87 /* NEC v850 */ |
|
262 #define EM_M32R 88 /* Mitsubishi M32R */ |
|
263 #define EM_MN10300 89 /* Matsushita MN10300 */ |
|
264 #define EM_MN10200 90 /* Matsushita MN10200 */ |
|
265 #define EM_PJ 91 /* picoJava */ |
|
266 #define EM_OPENRISC 92 /* OpenRISC 32-bit embedded processor */ |
|
267 #define EM_ARC_A5 93 /* ARC Cores Tangent-A5 */ |
|
268 #define EM_XTENSA 94 /* Tensilica Xtensa Architecture */ |
|
269 #define EM_VIDEOCORE 95 /* Alphamosaic VideoCore processor */ |
|
270 #define EM_TMM_GPP 96 /* Thompson Multimedia General Purpose Processor */ |
|
271 #define EM_NS32K 97 /* National Semiconductor 32000 series */ |
|
272 #define EM_TPC 98 /* Tenor Network TPC processor */ |
|
273 #define EM_SNP1K 99 /* Trebia SNP 1000 processor */ |
|
274 #define EM_ST200 100 /* STMicroelectronics (www.st.com) ST200 microcontroller */ |
|
275 #define EM_IP2K 101 /* Ubicom IP2xxx microcontroller family */ |
|
276 #define EM_MAX 102 /* MAX Processor */ |
|
277 #define EM_CR 103 /* National Semiconductor CompactRISC microprocessor */ |
|
278 #define EM_F2MC16 104 /* Fujitsu F2MC16 */ |
|
279 #define EM_MSP430 105 /* Texas Instruments embedded microcontroller msp430 */ |
|
280 #define EM_BLACKFIN 106 /* Analog Devices Blackfin (DSP) processor */ |
|
281 #define EM_SE_C33 107 /* S1C33 Family of Seiko Epson processors */ |
|
282 #define EM_SEP 108 /* Sharp embedded microprocessor */ |
|
283 #define EM_ARCA 109 /* Arca RISC Microprocessor */ |
|
284 #define EM_UNICORE 110 /* Microprocessor series from PKU-Unity Ltd. and MPRC of Peking University */ |
|
285 #define EM_NUM 111 |
|
286 |
|
287 /* |
|
288 * e_ident[EI_VERSION], e_version |
|
289 */ |
|
290 #define EV_NONE 0 |
|
291 #define EV_CURRENT 1 |
|
292 #define EV_NUM 2 |
|
293 |
|
294 /* |
|
295 * Section header |
|
296 */ |
|
297 typedef struct { |
|
298 Elf32_Word sh_name; |
|
299 Elf32_Word sh_type; |
|
300 Elf32_Word sh_flags; |
|
301 Elf32_Addr sh_addr; |
|
302 Elf32_Off sh_offset; |
|
303 Elf32_Word sh_size; |
|
304 Elf32_Word sh_link; |
|
305 Elf32_Word sh_info; |
|
306 Elf32_Word sh_addralign; |
|
307 Elf32_Word sh_entsize; |
|
308 } Elf32_Shdr; |
|
309 |
|
310 #if __LIBELF64 |
|
311 typedef struct { |
|
312 Elf64_Word sh_name; |
|
313 Elf64_Word sh_type; |
|
314 Elf64_Xword sh_flags; |
|
315 Elf64_Addr sh_addr; |
|
316 Elf64_Off sh_offset; |
|
317 Elf64_Xword sh_size; |
|
318 Elf64_Word sh_link; |
|
319 Elf64_Word sh_info; |
|
320 Elf64_Xword sh_addralign; |
|
321 Elf64_Xword sh_entsize; |
|
322 } Elf64_Shdr; |
|
323 #endif /* __LIBELF64 */ |
|
324 |
|
325 /* |
|
326 * Special section indices |
|
327 */ |
|
328 #define SHN_UNDEF 0 |
|
329 #define SHN_LORESERVE 0xff00 |
|
330 #define SHN_LOPROC 0xff00 |
|
331 #define SHN_HIPROC 0xff1f |
|
332 #define SHN_LOOS 0xff20 |
|
333 #define SHN_HIOS 0xff3f |
|
334 #define SHN_ABS 0xfff1 |
|
335 #define SHN_COMMON 0xfff2 |
|
336 #define SHN_XINDEX 0xffff |
|
337 #define SHN_HIRESERVE 0xffff |
|
338 |
|
339 /* |
|
340 * sh_type |
|
341 */ |
|
342 #define SHT_NULL 0 |
|
343 #define SHT_PROGBITS 1 |
|
344 #define SHT_SYMTAB 2 |
|
345 #define SHT_STRTAB 3 |
|
346 #define SHT_RELA 4 |
|
347 #define SHT_HASH 5 |
|
348 #define SHT_DYNAMIC 6 |
|
349 #define SHT_NOTE 7 |
|
350 #define SHT_NOBITS 8 |
|
351 #define SHT_REL 9 |
|
352 #define SHT_SHLIB 10 |
|
353 #define SHT_DYNSYM 11 |
|
354 #define SHT_INIT_ARRAY 14 |
|
355 #define SHT_FINI_ARRAY 15 |
|
356 #define SHT_PREINIT_ARRAY 16 |
|
357 #define SHT_GROUP 17 |
|
358 #define SHT_SYMTAB_SHNDX 18 |
|
359 #define SHT_NUM 19 |
|
360 #define SHT_LOOS 0x60000000 |
|
361 #define SHT_HIOS 0x6fffffff |
|
362 #define SHT_LOPROC 0x70000000 |
|
363 #define SHT_HIPROC 0x7fffffff |
|
364 #define SHT_LOUSER 0x80000000 |
|
365 #define SHT_HIUSER 0xffffffff |
|
366 |
|
367 /* |
|
368 * Solaris extensions |
|
369 */ |
|
370 #define SHT_LOSUNW 0x6ffffff4 |
|
371 #define SHT_SUNW_dof 0x6ffffff4 |
|
372 #define SHT_SUNW_cap 0x6ffffff5 |
|
373 #define SHT_SUNW_SIGNATURE 0x6ffffff6 |
|
374 #define SHT_SUNW_ANNOTATE 0x6ffffff7 |
|
375 #define SHT_SUNW_DEBUGSTR 0x6ffffff8 |
|
376 #define SHT_SUNW_DEBUG 0x6ffffff9 |
|
377 #define SHT_SUNW_move 0x6ffffffa |
|
378 #define SHT_SUNW_COMDAT 0x6ffffffb |
|
379 #define SHT_SUNW_syminfo 0x6ffffffc |
|
380 #define SHT_SUNW_verdef 0x6ffffffd |
|
381 #define SHT_SUNW_verneed 0x6ffffffe |
|
382 #define SHT_SUNW_versym 0x6fffffff |
|
383 #define SHT_HISUNW 0x6fffffff |
|
384 |
|
385 #define SHT_SPARC_GOTDATA 0x70000000 |
|
386 #define SHT_AMD64_UNWIND 0x70000001 |
|
387 |
|
388 /* |
|
389 * GNU extensions |
|
390 */ |
|
391 #define SHT_GNU_verdef 0x6ffffffd |
|
392 #define SHT_GNU_verneed 0x6ffffffe |
|
393 #define SHT_GNU_versym 0x6fffffff |
|
394 |
|
395 /* |
|
396 * sh_flags |
|
397 */ |
|
398 #define SHF_WRITE 0x1 |
|
399 #define SHF_ALLOC 0x2 |
|
400 #define SHF_EXECINSTR 0x4 |
|
401 #define SHF_MERGE 0x10 |
|
402 #define SHF_STRINGS 0x20 |
|
403 #define SHF_INFO_LINK 0x40 |
|
404 #define SHF_LINK_ORDER 0x80 |
|
405 #define SHF_OS_NONCONFORMING 0x100 |
|
406 #define SHF_GROUP 0x200 |
|
407 #define SHF_TLS 0x400 |
|
408 #define SHF_MASKOS 0x0ff00000 |
|
409 #define SHF_MASKPROC 0xf0000000 |
|
410 |
|
411 /* |
|
412 * Solaris extensions |
|
413 */ |
|
414 #define SHF_AMD64_LARGE 0x10000000 |
|
415 #define SHF_ORDERED 0x40000000 |
|
416 #define SHF_EXCLUDE 0x80000000 |
|
417 |
|
418 /* |
|
419 * Section group flags |
|
420 */ |
|
421 #define GRP_COMDAT 0x1 |
|
422 #define GRP_MASKOS 0x0ff00000 |
|
423 #define GRP_MASKPROC 0xf0000000 |
|
424 |
|
425 /* |
|
426 * Symbol table |
|
427 */ |
|
428 typedef struct { |
|
429 Elf32_Word st_name; |
|
430 Elf32_Addr st_value; |
|
431 Elf32_Word st_size; |
|
432 unsigned char st_info; |
|
433 unsigned char st_other; |
|
434 Elf32_Half st_shndx; |
|
435 } Elf32_Sym; |
|
436 |
|
437 #if __LIBELF64 |
|
438 typedef struct { |
|
439 Elf64_Word st_name; |
|
440 unsigned char st_info; |
|
441 unsigned char st_other; |
|
442 Elf64_Half st_shndx; |
|
443 Elf64_Addr st_value; |
|
444 Elf64_Xword st_size; |
|
445 } Elf64_Sym; |
|
446 #endif /* __LIBELF64 */ |
|
447 |
|
448 /* |
|
449 * Special symbol indices |
|
450 */ |
|
451 #define STN_UNDEF 0 |
|
452 |
|
453 /* |
|
454 * Macros for manipulating st_info |
|
455 */ |
|
456 #define ELF32_ST_BIND(i) ((i)>>4) |
|
457 #define ELF32_ST_TYPE(i) ((i)&0xf) |
|
458 #define ELF32_ST_INFO(b,t) (((b)<<4)+((t)&0xf)) |
|
459 |
|
460 #if __LIBELF64 |
|
461 #define ELF64_ST_BIND(i) ((i)>>4) |
|
462 #define ELF64_ST_TYPE(i) ((i)&0xf) |
|
463 #define ELF64_ST_INFO(b,t) (((b)<<4)+((t)&0xf)) |
|
464 #endif /* __LIBELF64 */ |
|
465 |
|
466 /* |
|
467 * Symbol binding |
|
468 */ |
|
469 #define STB_LOCAL 0 |
|
470 #define STB_GLOBAL 1 |
|
471 #define STB_WEAK 2 |
|
472 #define STB_NUM 3 |
|
473 #define STB_LOOS 10 |
|
474 #define STB_HIOS 12 |
|
475 #define STB_LOPROC 13 |
|
476 #define STB_HIPROC 15 |
|
477 |
|
478 /* |
|
479 * Symbol types |
|
480 */ |
|
481 #define STT_NOTYPE 0 |
|
482 #define STT_OBJECT 1 |
|
483 #define STT_FUNC 2 |
|
484 #define STT_SECTION 3 |
|
485 #define STT_FILE 4 |
|
486 #define STT_COMMON 5 |
|
487 #define STT_TLS 6 |
|
488 #define STT_NUM 7 |
|
489 #define STT_LOOS 10 |
|
490 #define STT_HIOS 12 |
|
491 #define STT_LOPROC 13 |
|
492 #define STT_HIPROC 15 |
|
493 |
|
494 /* |
|
495 * Macros for manipulating st_other |
|
496 */ |
|
497 #define ELF32_ST_VISIBILITY(o) ((o)&0x3) |
|
498 #if __LIBELF64 |
|
499 #define ELF64_ST_VISIBILITY(o) ((o)&0x3) |
|
500 #endif /* __LIBELF64 */ |
|
501 |
|
502 /* |
|
503 * Symbol visibility |
|
504 */ |
|
505 #define STV_DEFAULT 0 |
|
506 #define STV_INTERNAL 1 |
|
507 #define STV_HIDDEN 2 |
|
508 #define STV_PROTECTED 3 |
|
509 |
|
510 /* |
|
511 * Relocation |
|
512 */ |
|
513 typedef struct { |
|
514 Elf32_Addr r_offset; |
|
515 Elf32_Word r_info; |
|
516 } Elf32_Rel; |
|
517 |
|
518 typedef struct { |
|
519 Elf32_Addr r_offset; |
|
520 Elf32_Word r_info; |
|
521 Elf32_Sword r_addend; |
|
522 } Elf32_Rela; |
|
523 |
|
524 #if __LIBELF64 |
|
525 typedef struct { |
|
526 Elf64_Addr r_offset; |
|
527 Elf64_Xword r_info; |
|
528 } Elf64_Rel; |
|
529 |
|
530 typedef struct { |
|
531 Elf64_Addr r_offset; |
|
532 Elf64_Xword r_info; |
|
533 Elf64_Sxword r_addend; |
|
534 } Elf64_Rela; |
|
535 #endif /* __LIBELF64 */ |
|
536 |
|
537 /* |
|
538 * Macros for manipulating r_info |
|
539 */ |
|
540 #define ELF32_R_SYM(i) ((i)>>8) |
|
541 #define ELF32_R_TYPE(i) ((unsigned char)(i)) |
|
542 #define ELF32_R_INFO(s,t) (((s)<<8)+(unsigned char)(t)) |
|
543 |
|
544 #if __LIBELF64 |
|
545 #define ELF64_R_SYM(i) ((Elf64_Xword)(i)>>32) |
|
546 #define ELF64_R_TYPE(i) ((i)&0xffffffffL) |
|
547 #define ELF64_R_INFO(s,t) (((Elf64_Xword)(s)<<32)+((t)&0xffffffffL)) |
|
548 #endif /* __LIBELF64 */ |
|
549 |
|
550 /* |
|
551 * Note entry header |
|
552 */ |
|
553 typedef struct { |
|
554 Elf32_Word n_namesz; /* name size */ |
|
555 Elf32_Word n_descsz; /* descriptor size */ |
|
556 Elf32_Word n_type; /* descriptor type */ |
|
557 } Elf32_Nhdr; |
|
558 |
|
559 #if __LIBELF64 |
|
560 /* Solaris and GNU use this layout. Be compatible. */ |
|
561 /* XXX: Latest ELF specs say it's 64-bit!!! */ |
|
562 typedef struct { |
|
563 Elf64_Word n_namesz; /* name size */ |
|
564 Elf64_Word n_descsz; /* descriptor size */ |
|
565 Elf64_Word n_type; /* descriptor type */ |
|
566 } Elf64_Nhdr; |
|
567 #endif /* __LIBELF64 */ |
|
568 |
|
569 /* |
|
570 * Well-known descriptor types for ET_CORE files |
|
571 */ |
|
572 #define NT_PRSTATUS 1 |
|
573 #define NT_PRFPREG 2 |
|
574 #define NT_PRPSINFO 3 |
|
575 |
|
576 /* |
|
577 * Program header |
|
578 */ |
|
579 typedef struct { |
|
580 Elf32_Word p_type; |
|
581 Elf32_Off p_offset; |
|
582 Elf32_Addr p_vaddr; |
|
583 Elf32_Addr p_paddr; |
|
584 Elf32_Word p_filesz; |
|
585 Elf32_Word p_memsz; |
|
586 Elf32_Word p_flags; |
|
587 Elf32_Word p_align; |
|
588 } Elf32_Phdr; |
|
589 |
|
590 #if __LIBELF64 |
|
591 typedef struct { |
|
592 Elf64_Word p_type; |
|
593 Elf64_Word p_flags; |
|
594 Elf64_Off p_offset; |
|
595 Elf64_Addr p_vaddr; |
|
596 Elf64_Addr p_paddr; |
|
597 Elf64_Xword p_filesz; |
|
598 Elf64_Xword p_memsz; |
|
599 Elf64_Xword p_align; |
|
600 } Elf64_Phdr; |
|
601 #endif /* __LIBELF64 */ |
|
602 |
|
603 /* |
|
604 * Special numbers |
|
605 */ |
|
606 #define PN_XNUM 0xffff |
|
607 |
|
608 /* |
|
609 * p_type |
|
610 */ |
|
611 #define PT_NULL 0 |
|
612 #define PT_LOAD 1 |
|
613 #define PT_DYNAMIC 2 |
|
614 #define PT_INTERP 3 |
|
615 #define PT_NOTE 4 |
|
616 #define PT_SHLIB 5 |
|
617 #define PT_PHDR 6 |
|
618 #define PT_TLS 7 |
|
619 #define PT_NUM 8 |
|
620 #define PT_LOOS 0x60000000 |
|
621 #define PT_HIOS 0x6fffffff |
|
622 #define PT_LOPROC 0x70000000 |
|
623 #define PT_HIPROC 0x7fffffff |
|
624 |
|
625 /* |
|
626 * Solaris extensions |
|
627 */ |
|
628 |
|
629 #define PT_SUNW_UNWIND 0x6464e550 |
|
630 #define PT_LOSUNW 0x6ffffffa |
|
631 #define PT_SUNWBSS 0x6ffffffa |
|
632 #define PT_SUNWSTACK 0x6ffffffb |
|
633 #define PT_SUNWDTRACE 0x6ffffffc |
|
634 #define PT_SUNWCAP 0x6ffffffd |
|
635 #define PT_HISUNW 0x6fffffff |
|
636 |
|
637 /* |
|
638 * p_flags |
|
639 */ |
|
640 #define PF_X 0x1 |
|
641 #define PF_W 0x2 |
|
642 #define PF_R 0x4 |
|
643 #define PF_MASKOS 0x0ff00000 |
|
644 #define PF_MASKPROC 0xf0000000 |
|
645 |
|
646 /* |
|
647 * Dynamic structure |
|
648 */ |
|
649 typedef struct { |
|
650 Elf32_Sword d_tag; |
|
651 union { |
|
652 Elf32_Word d_val; |
|
653 Elf32_Addr d_ptr; |
|
654 } d_un; |
|
655 } Elf32_Dyn; |
|
656 |
|
657 #if __LIBELF64 |
|
658 typedef struct { |
|
659 Elf64_Sxword d_tag; |
|
660 union { |
|
661 Elf64_Xword d_val; |
|
662 Elf64_Addr d_ptr; |
|
663 } d_un; |
|
664 } Elf64_Dyn; |
|
665 #endif /* __LIBELF64 */ |
|
666 |
|
667 /* |
|
668 * Dynamic array tags |
|
669 */ |
|
670 /* d_un exec shared */ |
|
671 #define DT_NULL 0 /* ign. mand. mand. */ |
|
672 #define DT_NEEDED 1 /* d_val opt. opt. */ |
|
673 #define DT_PLTRELSZ 2 /* d_val opt. opt. */ |
|
674 #define DT_PLTGOT 3 /* d_ptr opt. opt. */ |
|
675 #define DT_HASH 4 /* d_ptr mand. mand. */ |
|
676 #define DT_STRTAB 5 /* d_ptr mand. mand. */ |
|
677 #define DT_SYMTAB 6 /* d_ptr mand. mand. */ |
|
678 #define DT_RELA 7 /* d_ptr mand. opt. */ |
|
679 #define DT_RELASZ 8 /* d_val mand. opt. */ |
|
680 #define DT_RELAENT 9 /* d_val mand. opt. */ |
|
681 #define DT_STRSZ 10 /* d_val mand. mand. */ |
|
682 #define DT_SYMENT 11 /* d_val mand. mand. */ |
|
683 #define DT_INIT 12 /* d_ptr opt. opt. */ |
|
684 #define DT_FINI 13 /* d_ptr opt. opt. */ |
|
685 #define DT_SONAME 14 /* d_val ign. opt. */ |
|
686 #define DT_RPATH 15 /* d_val opt. ign. */ |
|
687 #define DT_SYMBOLIC 16 /* ign. ign. opt. */ |
|
688 #define DT_REL 17 /* d_ptr mand. opt. */ |
|
689 #define DT_RELSZ 18 /* d_val mand. opt. */ |
|
690 #define DT_RELENT 19 /* d_val mand. opt. */ |
|
691 #define DT_PLTREL 20 /* d_val opt. opt. */ |
|
692 #define DT_DEBUG 21 /* d_ptr opt. ign. */ |
|
693 #define DT_TEXTREL 22 /* ign. opt. opt. */ |
|
694 #define DT_JMPREL 23 /* d_ptr opt. opt. */ |
|
695 #define DT_BIND_NOW 24 /* ign. opt. opt. */ |
|
696 #define DT_INIT_ARRAY 25 /* d_ptr opt. opt. */ |
|
697 #define DT_FINI_ARRAY 26 /* d_ptr opt. opt. */ |
|
698 #define DT_INIT_ARRAYSZ 27 /* d_val opt. opt. */ |
|
699 #define DT_FINI_ARRAYSZ 28 /* d_val opt. opt. */ |
|
700 #define DT_RUNPATH 29 /* d_val opt. opt. */ |
|
701 #define DT_FLAGS 30 /* d_val opt. opt. */ |
|
702 #define DT_ENCODING 32 /* odd/even encoding rule starts here */ |
|
703 #define DT_PREINIT_ARRAY 32 /* d_ptr opt. ign. */ |
|
704 #define DT_PREINIT_ARRAYSZ 33 /* d_val opt. ign. */ |
|
705 #define DT_NUM 34 |
|
706 #define DT_LOOS 0x6000000D |
|
707 #define DT_HIOS 0x6ffff000 |
|
708 #define DT_LOPROC 0x70000000 |
|
709 #define DT_HIPROC 0x7fffffff |
|
710 |
|
711 /* |
|
712 * DT_FLAGS values |
|
713 */ |
|
714 #define DF_ORIGIN 0x1 |
|
715 #define DF_SYMBOLIC 0x2 |
|
716 #define DF_TEXTREL 0x4 |
|
717 #define DF_BIND_NOW 0x8 |
|
718 #define DF_STATIC_TLS 0x10 |
|
719 |
|
720 /* |
|
721 * Solaris extensions |
|
722 */ |
|
723 #define DT_VALRNGLO 0x6ffffd00 |
|
724 #define DT_CHECKSUM 0x6ffffdf8 |
|
725 #define DT_PLTPADSZ 0x6ffffdf9 |
|
726 #define DT_MOVEENT 0x6ffffdfa |
|
727 #define DT_MOVESZ 0x6ffffdfb |
|
728 #define DT_FEATURE_1 0x6ffffdfc |
|
729 #define DT_POSFLAG_1 0x6ffffdfd |
|
730 #define DT_SYMINSZ 0x6ffffdfe |
|
731 #define DT_SYMINENT 0x6ffffdff |
|
732 #define DT_VALRNGHI 0x6ffffdff |
|
733 |
|
734 #define DT_ADDRRNGLO 0x6ffffe00 |
|
735 #define DT_CONFIG 0x6ffffefa |
|
736 #define DT_DEPAUDIT 0x6ffffefb |
|
737 #define DT_AUDIT 0x6ffffefc |
|
738 #define DT_PLTPAD 0x6ffffefd |
|
739 #define DT_MOVETAB 0x6ffffefe |
|
740 #define DT_SYMINFO 0x6ffffeff |
|
741 #define DT_ADDRRNGHI 0x6ffffeff |
|
742 |
|
743 #define DT_RELACOUNT 0x6ffffff9 |
|
744 #define DT_RELCOUNT 0x6ffffffa |
|
745 #define DT_FLAGS_1 0x6ffffffb |
|
746 #define DT_VERDEF 0x6ffffffc |
|
747 #define DT_VERDEFNUM 0x6ffffffd |
|
748 #define DT_VERNEED 0x6ffffffe |
|
749 #define DT_VERNEEDNUM 0x6fffffff |
|
750 |
|
751 #define DT_AUXILIARY 0x7ffffffd |
|
752 #define DT_USED 0x7ffffffe |
|
753 #define DT_FILTER 0x7fffffff |
|
754 |
|
755 /* |
|
756 * GNU extensions |
|
757 */ |
|
758 #define DT_VERSYM 0x6ffffff0 |
|
759 |
|
760 /* |
|
761 * DT_FEATURE_1 values |
|
762 */ |
|
763 #define DTF_1_PARINIT 0x1 |
|
764 #define DTF_1_CONFEXP 0x2 |
|
765 |
|
766 /* |
|
767 * DT_POSFLAG_1 values |
|
768 */ |
|
769 #define DF_P1_LAZYLOAD 0x1 |
|
770 #define DF_P1_GROUPPERM 0x2 |
|
771 |
|
772 /* |
|
773 * DT_FLAGS_1 values |
|
774 */ |
|
775 #define DF_1_NOW 0x00000001 |
|
776 #define DF_1_GLOBAL 0x00000002 |
|
777 #define DF_1_GROUP 0x00000004 |
|
778 #define DF_1_NODELETE 0x00000008 |
|
779 #define DF_1_LOADFLTR 0x00000010 |
|
780 #define DF_1_INITFIRST 0x00000020 |
|
781 #define DF_1_NOOPEN 0x00000040 |
|
782 #define DF_1_ORIGIN 0x00000080 |
|
783 #define DF_1_DIRECT 0x00000100 |
|
784 #define DF_1_TRANS 0x00000200 |
|
785 #define DF_1_INTERPOSE 0x00000400 |
|
786 #define DF_1_NODEFLIB 0x00000800 |
|
787 #define DF_1_NODUMP 0x00001000 |
|
788 #define DF_1_CONFALT 0x00002000 |
|
789 #define DF_1_ENDFILTEE 0x00004000 |
|
790 #define DF_1_DISPRELDNE 0x00008000 |
|
791 #define DF_1_DISPRELPND 0x00010000 |
|
792 |
|
793 /* |
|
794 * Syminfo structure |
|
795 */ |
|
796 typedef struct { |
|
797 Elf32_Half si_boundto; |
|
798 Elf32_Half si_flags; |
|
799 } Elf32_Syminfo; |
|
800 |
|
801 #if __LIBELF64 |
|
802 typedef struct { |
|
803 Elf64_Half si_boundto; |
|
804 Elf64_Half si_flags; |
|
805 } Elf64_Syminfo; |
|
806 #endif /* __LIBELF64 */ |
|
807 |
|
808 /* |
|
809 * Syminfo version (stored in unused first entry) |
|
810 */ |
|
811 #define SYMINFO_NONE 0 |
|
812 #define SYMINFO_CURRENT 1 |
|
813 #define SYMINFO_NUM 2 |
|
814 |
|
815 /* |
|
816 * si_boundto special values |
|
817 */ |
|
818 #define SYMINFO_BT_LOWRESERVE 0xff00 |
|
819 #define SYMINFO_BT_PARENT 0xfffe /* bound to parent */ |
|
820 #define SYMINFO_BT_SELF 0xffff /* bound to self */ |
|
821 |
|
822 /* |
|
823 * si_flags |
|
824 */ |
|
825 #define SYMINFO_FLG_DIRECT 0x01 /* bound to an object */ |
|
826 #define SYMINFO_FLG_PASSTHRU 0x02 /* pass-thru symbol */ |
|
827 #define SYMINFO_FLG_COPY 0x04 /* result of a copy relocation */ |
|
828 #define SYMINFO_FLG_LAZYLOAD 0x08 /* bound to lazy-loaded object */ |
|
829 |
|
830 /* |
|
831 * Version definitions |
|
832 */ |
|
833 typedef struct { |
|
834 Elf32_Half vd_version; |
|
835 Elf32_Half vd_flags; |
|
836 Elf32_Half vd_ndx; |
|
837 Elf32_Half vd_cnt; |
|
838 Elf32_Word vd_hash; |
|
839 Elf32_Word vd_aux; |
|
840 Elf32_Word vd_next; |
|
841 } Elf32_Verdef; |
|
842 |
|
843 typedef struct { |
|
844 Elf32_Word vda_name; |
|
845 Elf32_Word vda_next; |
|
846 } Elf32_Verdaux; |
|
847 |
|
848 typedef struct { |
|
849 Elf32_Half vn_version; |
|
850 Elf32_Half vn_cnt; |
|
851 Elf32_Word vn_file; |
|
852 Elf32_Word vn_aux; |
|
853 Elf32_Word vn_next; |
|
854 } Elf32_Verneed; |
|
855 |
|
856 typedef struct { |
|
857 Elf32_Word vna_hash; |
|
858 Elf32_Half vna_flags; |
|
859 Elf32_Half vna_other; |
|
860 Elf32_Word vna_name; |
|
861 Elf32_Word vna_next; |
|
862 } Elf32_Vernaux; |
|
863 |
|
864 typedef Elf32_Half Elf32_Versym; |
|
865 |
|
866 #if __LIBELF64 |
|
867 |
|
868 typedef struct { |
|
869 Elf64_Half vd_version; |
|
870 Elf64_Half vd_flags; |
|
871 Elf64_Half vd_ndx; |
|
872 Elf64_Half vd_cnt; |
|
873 Elf64_Word vd_hash; |
|
874 Elf64_Word vd_aux; |
|
875 Elf64_Word vd_next; |
|
876 } Elf64_Verdef; |
|
877 |
|
878 typedef struct { |
|
879 Elf64_Word vda_name; |
|
880 Elf64_Word vda_next; |
|
881 } Elf64_Verdaux; |
|
882 |
|
883 typedef struct { |
|
884 Elf64_Half vn_version; |
|
885 Elf64_Half vn_cnt; |
|
886 Elf64_Word vn_file; |
|
887 Elf64_Word vn_aux; |
|
888 Elf64_Word vn_next; |
|
889 } Elf64_Verneed; |
|
890 |
|
891 typedef struct { |
|
892 Elf64_Word vna_hash; |
|
893 Elf64_Half vna_flags; |
|
894 Elf64_Half vna_other; |
|
895 Elf64_Word vna_name; |
|
896 Elf64_Word vna_next; |
|
897 } Elf64_Vernaux; |
|
898 |
|
899 typedef Elf64_Half Elf64_Versym; |
|
900 |
|
901 #endif /* __LIBELF64 */ |
|
902 |
|
903 /* |
|
904 * vd_version |
|
905 */ |
|
906 #define VER_DEF_NONE 0 |
|
907 #define VER_DEF_CURRENT 1 |
|
908 #define VER_DEF_NUM 2 |
|
909 |
|
910 /* |
|
911 * vn_version |
|
912 */ |
|
913 #define VER_NEED_NONE 0 |
|
914 #define VER_NEED_CURRENT 1 |
|
915 #define VER_NEED_NUM 2 |
|
916 |
|
917 /* |
|
918 * vd_flags / vna_flags |
|
919 */ |
|
920 #define VER_FLG_BASE 0x1 /* vd_flags only */ |
|
921 #define VER_FLG_WEAK 0x2 |
|
922 |
|
923 /* |
|
924 * Elf*_Versym special values |
|
925 */ |
|
926 #define VER_NDX_LOCAL 0 |
|
927 #define VER_NDX_GLOBAL 1 |
|
928 |
|
929 /* |
|
930 * Solaris extensions |
|
931 */ |
|
932 |
|
933 /* |
|
934 * Move section |
|
935 */ |
|
936 #if __LIBELF64 |
|
937 |
|
938 typedef struct { |
|
939 Elf32_Lword m_value; |
|
940 Elf32_Word m_info; |
|
941 Elf32_Word m_poffset; |
|
942 Elf32_Half m_repeat; |
|
943 Elf32_Half m_stride; |
|
944 } Elf32_Move; |
|
945 |
|
946 typedef struct { |
|
947 Elf64_Lword m_value; |
|
948 Elf64_Xword m_info; |
|
949 Elf64_Xword m_poffset; |
|
950 Elf64_Half m_repeat; |
|
951 Elf64_Half m_stride; |
|
952 } Elf64_Move; |
|
953 |
|
954 #define ELF32_M_SYM(info) ((info)>>8) |
|
955 #define ELF32_M_SIZE(info) ((unsigned char)(info)) |
|
956 #define ELF32_M_INFO(sym, sz) (((sym)<<8)+(unsigned char)(sz)) |
|
957 |
|
958 #define ELF64_M_SYM(info) ((Elf64_Xword)(info)>>8) |
|
959 #define ELF64_M_SIZE(info) ((unsigned char)(info)) |
|
960 #define ELF64_M_INFO(sym, sz) (((Elf64_Xword)(sym)<<8)+(unsigned char)(sz)) |
|
961 |
|
962 #endif /* __LIBELF64 */ |
|
963 |
|
964 /* |
|
965 * Capabilities |
|
966 */ |
|
967 |
|
968 typedef struct { |
|
969 Elf32_Word c_tag; |
|
970 union { |
|
971 Elf32_Word c_val; |
|
972 Elf32_Addr c_ptr; |
|
973 } c_un; |
|
974 } Elf32_Cap; |
|
975 |
|
976 typedef struct { |
|
977 Elf64_Xword c_tag; |
|
978 union { |
|
979 Elf64_Xword c_val; |
|
980 Elf64_Addr c_ptr; |
|
981 } c_un; |
|
982 } Elf64_Cap; |
|
983 |
|
984 #define CA_SUNW_NULL 0 /* c_un ignored */ |
|
985 #define CA_SUNW_HW_1 1 /* c_un.c_val */ |
|
986 #define CA_SUNW_SF_1 2 /* c_un.c_val */ |
|
987 |
|
988 #ifdef __cplusplus |
|
989 } |
|
990 #endif /* __cplusplus */ |
|
991 |
|
992 #endif /* _ELF_REPL_H */ |