├── .classpath
├── .gitignore
├── .project
├── .settings
└── org.eclipse.jdt.core.prefs
├── README.md
├── bin
└── com
│ └── demo
│ └── parseso
│ └── elf.h
├── so
├── libhello-jni.so
└── libhello-jnis.so
└── src
└── com
└── demo
└── parseso
├── AddSection.java
├── ElfType32.java
├── ElfType64.java
├── ParseSo.java
├── Utils.java
└── elf.h
/.classpath:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | *.class
2 |
3 | # Mobile Tools for Java (J2ME)
4 | .mtj.tmp/
5 |
6 | # Package Files #
7 | *.jar
8 | *.war
9 | *.ear
10 |
11 | # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
12 | hs_err_pid*
13 |
--------------------------------------------------------------------------------
/.project:
--------------------------------------------------------------------------------
1 |
2 |
3 | SoFileParse
4 |
5 |
6 |
7 |
8 |
9 | org.eclipse.jdt.core.javabuilder
10 |
11 |
12 |
13 |
14 |
15 | org.eclipse.jdt.core.javanature
16 |
17 |
18 |
--------------------------------------------------------------------------------
/.settings/org.eclipse.jdt.core.prefs:
--------------------------------------------------------------------------------
1 | eclipse.preferences.version=1
2 | org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
3 | org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7
4 | org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
5 | org.eclipse.jdt.core.compiler.compliance=1.7
6 | org.eclipse.jdt.core.compiler.debug.lineNumber=generate
7 | org.eclipse.jdt.core.compiler.debug.localVariable=generate
8 | org.eclipse.jdt.core.compiler.debug.sourceFile=generate
9 | org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
10 | org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
11 | org.eclipse.jdt.core.compiler.source=1.7
12 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # parse_androidso
2 | 解析Android中so文件格式
3 |
--------------------------------------------------------------------------------
/bin/com/demo/parseso/elf.h:
--------------------------------------------------------------------------------
1 | #ifndef _QEMU_ELF_H
2 | #define _QEMU_ELF_H
3 | #include
4 | /* 32-bit ELF base types. */
5 | typedef uint32_t Elf32_Addr;
6 | typedef uint16_t Elf32_Half;
7 | typedef uint32_t Elf32_Off;
8 | typedef int32_t Elf32_Sword;
9 | typedef uint32_t Elf32_Word;
10 | /* 64-bit ELF base types. */
11 | typedef uint64_t Elf64_Addr;
12 | typedef uint16_t Elf64_Half;
13 | typedef int16_t Elf64_SHalf;
14 | typedef uint64_t Elf64_Off;
15 | typedef int32_t Elf64_Sword;
16 | typedef uint32_t Elf64_Word;
17 | typedef uint64_t Elf64_Xword;
18 | typedef int64_t Elf64_Sxword;
19 | /* These constants are for the segment types stored in the image headers */
20 | #define PT_NULL 0
21 | #define PT_LOAD 1
22 | #define PT_DYNAMIC 2
23 | #define PT_INTERP 3
24 | #define PT_NOTE 4
25 | #define PT_SHLIB 5
26 | #define PT_PHDR 6
27 | #define PT_LOPROC 0x70000000
28 | #define PT_HIPROC 0x7fffffff
29 | #define PT_MIPS_REGINFO 0x70000000
30 | #define PT_MIPS_OPTIONS 0x70000001
31 | /* Flags in the e_flags field of the header */
32 | /* MIPS architecture level. */
33 | #define EF_MIPS_ARCH_1 0x00000000 /* -mips1 code. */
34 | #define EF_MIPS_ARCH_2 0x10000000 /* -mips2 code. */
35 | #define EF_MIPS_ARCH_3 0x20000000 /* -mips3 code. */
36 | #define EF_MIPS_ARCH_4 0x30000000 /* -mips4 code. */
37 | #define EF_MIPS_ARCH_5 0x40000000 /* -mips5 code. */
38 | #define EF_MIPS_ARCH_32 0x50000000 /* MIPS32 code. */
39 | #define EF_MIPS_ARCH_64 0x60000000 /* MIPS64 code. */
40 | /* The ABI of a file. */
41 | #define EF_MIPS_ABI_O32 0x00001000 /* O32 ABI. */
42 | #define EF_MIPS_ABI_O64 0x00002000 /* O32 extended for 64 bit. */
43 | #define EF_MIPS_NOREORDER 0x00000001
44 | #define EF_MIPS_PIC 0x00000002
45 | #define EF_MIPS_CPIC 0x00000004
46 | #define EF_MIPS_ABI2 0x00000020
47 | #define EF_MIPS_OPTIONS_FIRST 0x00000080
48 | #define EF_MIPS_32BITMODE 0x00000100
49 | #define EF_MIPS_ABI 0x0000f000
50 | #define EF_MIPS_ARCH 0xf0000000
51 | /* These constants define the different elf file types */
52 | #define ET_NONE 0
53 | #define ET_REL 1
54 | #define ET_EXEC 2
55 | #define ET_DYN 3
56 | #define ET_CORE 4
57 | #define ET_LOPROC 0xff00
58 | #define ET_HIPROC 0xffff
59 | /* These constants define the various ELF target machines */
60 | #define EM_NONE 0
61 | #define EM_M32 1
62 | #define EM_SPARC 2
63 | #define EM_386 3
64 | #define EM_68K 4
65 | #define EM_88K 5
66 | #define EM_486 6 /* Perhaps disused */
67 | #define EM_860 7
68 | #define EM_MIPS 8 /* MIPS R3000 (officially, big-endian only) */
69 | #define EM_MIPS_RS4_BE 10 /* MIPS R4000 big-endian */
70 | #define EM_PARISC 15 /* HPPA */
71 | #define EM_SPARC32PLUS 18 /* Sun's "v8plus" */
72 | #define EM_PPC 20 /* PowerPC */
73 | #define EM_PPC64 21 /* PowerPC64 */
74 | #define EM_ARM 40 /* ARM */
75 | #define EM_SH 42 /* SuperH */
76 | #define EM_SPARCV9 43 /* SPARC v9 64-bit */
77 | #define EM_IA_64 50 /* HP/Intel IA-64 */
78 | #define EM_X86_64 62 /* AMD x86-64 */
79 | #define EM_S390 22 /* IBM S/390 */
80 | #define EM_CRIS 76 /* Axis Communications 32-bit embedded processor */
81 | #define EM_V850 87 /* NEC v850 */
82 | #define EM_H8_300H 47 /* Hitachi H8/300H */
83 | #define EM_H8S 48 /* Hitachi H8S */
84 | /*
85 | * This is an interim value that we will use until the committee comes
86 | * up with a final number.
87 | */
88 | #define EM_ALPHA 0x9026
89 | /* Bogus old v850 magic number, used by old tools. */
90 | #define EM_CYGNUS_V850 0x9080
91 | /*
92 | * This is the old interim value for S/390 architecture
93 | */
94 | #define EM_S390_OLD 0xA390
95 | /* This is the info that is needed to parse the dynamic section of the file */
96 | #define DT_NULL 0
97 | #define DT_NEEDED 1
98 | #define DT_PLTRELSZ 2
99 | #define DT_PLTGOT 3
100 | #define DT_HASH 4
101 | #define DT_STRTAB 5
102 | #define DT_SYMTAB 6
103 | #define DT_RELA 7
104 | #define DT_RELASZ 8
105 | #define DT_RELAENT 9
106 | #define DT_STRSZ 10
107 | #define DT_SYMENT 11
108 | #define DT_INIT 12
109 | #define DT_FINI 13
110 | #define DT_SONAME 14
111 | #define DT_RPATH 15
112 | #define DT_SYMBOLIC 16
113 | #define DT_REL 17
114 | #define DT_RELSZ 18
115 | #define DT_RELENT 19
116 | #define DT_PLTREL 20
117 | #define DT_DEBUG 21
118 | #define DT_TEXTREL 22
119 | #define DT_JMPREL 23
120 | #define DT_LOPROC 0x70000000
121 | #define DT_HIPROC 0x7fffffff
122 | #define DT_MIPS_RLD_VERSION 0x70000001
123 | #define DT_MIPS_TIME_STAMP 0x70000002
124 | #define DT_MIPS_ICHECKSUM 0x70000003
125 | #define DT_MIPS_IVERSION 0x70000004
126 | #define DT_MIPS_FLAGS 0x70000005
127 | #define RHF_NONE 0
128 | #define RHF_HARDWAY 1
129 | #define RHF_NOTPOT 2
130 | #define DT_MIPS_BASE_ADDRESS 0x70000006
131 | #define DT_MIPS_CONFLICT 0x70000008
132 | #define DT_MIPS_LIBLIST 0x70000009
133 | #define DT_MIPS_LOCAL_GOTNO 0x7000000a
134 | #define DT_MIPS_CONFLICTNO 0x7000000b
135 | #define DT_MIPS_LIBLISTNO 0x70000010
136 | #define DT_MIPS_SYMTABNO 0x70000011
137 | #define DT_MIPS_UNREFEXTNO 0x70000012
138 | #define DT_MIPS_GOTSYM 0x70000013
139 | #define DT_MIPS_HIPAGENO 0x70000014
140 | #define DT_MIPS_RLD_MAP 0x70000016
141 | /* This info is needed when parsing the symbol table */
142 | #define STB_LOCAL 0
143 | #define STB_GLOBAL 1
144 | #define STB_WEAK 2
145 | #define STT_NOTYPE 0
146 | #define STT_OBJECT 1
147 | #define STT_FUNC 2
148 | #define STT_SECTION 3
149 | #define STT_FILE 4
150 | #define ELF_ST_BIND(x) ((x) >> 4)
151 | #define ELF_ST_TYPE(x) (((unsigned int) x) & 0xf)
152 | #define ELF32_ST_BIND(x) ELF_ST_BIND(x)
153 | #define ELF32_ST_TYPE(x) ELF_ST_TYPE(x)
154 | #define ELF64_ST_BIND(x) ELF_ST_BIND(x)
155 | #define ELF64_ST_TYPE(x) ELF_ST_TYPE(x)
156 | /* Symbolic values for the entries in the auxiliary table
157 | put on the initial stack */
158 | #define AT_NULL 0 /* end of vector */
159 | #define AT_IGNORE 1 /* entry should be ignored */
160 | #define AT_EXECFD 2 /* file descriptor of program */
161 | #define AT_PHDR 3 /* program headers for program */
162 | #define AT_PHENT 4 /* size of program header entry */
163 | #define AT_PHNUM 5 /* number of program headers */
164 | #define AT_PAGESZ 6 /* system page size */
165 | #define AT_BASE 7 /* base address of interpreter */
166 | #define AT_FLAGS 8 /* flags */
167 | #define AT_ENTRY 9 /* entry point of program */
168 | #define AT_NOTELF 10 /* program is not ELF */
169 | #define AT_UID 11 /* real uid */
170 | #define AT_EUID 12 /* effective uid */
171 | #define AT_GID 13 /* real gid */
172 | #define AT_EGID 14 /* effective gid */
173 | #define AT_PLATFORM 15 /* string identifying CPU for optimizations */
174 | #define AT_HWCAP 16 /* arch dependent hints at CPU capabilities */
175 | #define AT_CLKTCK 17 /* frequency at which times() increments */
176 | typedef struct dynamic{
177 | Elf32_Sword d_tag;
178 | union{
179 | Elf32_Sword d_val;
180 | Elf32_Addr d_ptr;
181 | } d_un;
182 | } Elf32_Dyn;
183 | typedef struct {
184 | Elf64_Sxword d_tag; /* entry tag value */
185 | union {
186 | Elf64_Xword d_val;
187 | Elf64_Addr d_ptr;
188 | } d_un;
189 | } Elf64_Dyn;
190 | /* The following are used with relocations */
191 | #define ELF32_R_SYM(x) ((x) >> 8)
192 | #define ELF32_R_TYPE(x) ((x) & 0xff)
193 | #define ELF64_R_SYM(i) ((i) >> 32)
194 | #define ELF64_R_TYPE(i) ((i) & 0xffffffff)
195 | #define ELF64_R_TYPE_DATA(i) (((ELF64_R_TYPE(i) >> 8) ^ 0x00800000) - 0x00800000)
196 | #define R_386_NONE 0
197 | #define R_386_32 1
198 | #define R_386_PC32 2
199 | #define R_386_GOT32 3
200 | #define R_386_PLT32 4
201 | #define R_386_COPY 5
202 | #define R_386_GLOB_DAT 6
203 | #define R_386_JMP_SLOT 7
204 | #define R_386_RELATIVE 8
205 | #define R_386_GOTOFF 9
206 | #define R_386_GOTPC 10
207 | #define R_386_NUM 11
208 | #define R_MIPS_NONE 0
209 | #define R_MIPS_16 1
210 | #define R_MIPS_32 2
211 | #define R_MIPS_REL32 3
212 | #define R_MIPS_26 4
213 | #define R_MIPS_HI16 5
214 | #define R_MIPS_LO16 6
215 | #define R_MIPS_GPREL16 7
216 | #define R_MIPS_LITERAL 8
217 | #define R_MIPS_GOT16 9
218 | #define R_MIPS_PC16 10
219 | #define R_MIPS_CALL16 11
220 | #define R_MIPS_GPREL32 12
221 | /* The remaining relocs are defined on Irix, although they are not
222 | in the MIPS ELF ABI. */
223 | #define R_MIPS_UNUSED1 13
224 | #define R_MIPS_UNUSED2 14
225 | #define R_MIPS_UNUSED3 15
226 | #define R_MIPS_SHIFT5 16
227 | #define R_MIPS_SHIFT6 17
228 | #define R_MIPS_64 18
229 | #define R_MIPS_GOT_DISP 19
230 | #define R_MIPS_GOT_PAGE 20
231 | #define R_MIPS_GOT_OFST 21
232 | /*
233 | * The following two relocation types are specified in the MIPS ABI
234 | * conformance guide version 1.2 but not yet in the psABI.
235 | */
236 | #define R_MIPS_GOTHI16 22
237 | #define R_MIPS_GOTLO16 23
238 | #define R_MIPS_SUB 24
239 | #define R_MIPS_INSERT_A 25
240 | #define R_MIPS_INSERT_B 26
241 | #define R_MIPS_DELETE 27
242 | #define R_MIPS_HIGHER 28
243 | #define R_MIPS_HIGHEST 29
244 | /*
245 | * The following two relocation types are specified in the MIPS ABI
246 | * conformance guide version 1.2 but not yet in the psABI.
247 | */
248 | #define R_MIPS_CALLHI16 30
249 | #define R_MIPS_CALLLO16 31
250 | /*
251 | * This range is reserved for vendor specific relocations.
252 | */
253 | #define R_MIPS_LOVENDOR 100
254 | #define R_MIPS_HIVENDOR 127
255 | /*
256 | * Sparc ELF relocation types
257 | */
258 | #define R_SPARC_NONE 0
259 | #define R_SPARC_8 1
260 | #define R_SPARC_16 2
261 | #define R_SPARC_32 3
262 | #define R_SPARC_DISP8 4
263 | #define R_SPARC_DISP16 5
264 | #define R_SPARC_DISP32 6
265 | #define R_SPARC_WDISP30 7
266 | #define R_SPARC_WDISP22 8
267 | #define R_SPARC_HI22 9
268 | #define R_SPARC_22 10
269 | #define R_SPARC_13 11
270 | #define R_SPARC_LO10 12
271 | #define R_SPARC_GOT10 13
272 | #define R_SPARC_GOT13 14
273 | #define R_SPARC_GOT22 15
274 | #define R_SPARC_PC10 16
275 | #define R_SPARC_PC22 17
276 | #define R_SPARC_WPLT30 18
277 | #define R_SPARC_COPY 19
278 | #define R_SPARC_GLOB_DAT 20
279 | #define R_SPARC_JMP_SLOT 21
280 | #define R_SPARC_RELATIVE 22
281 | #define R_SPARC_UA32 23
282 | #define R_SPARC_PLT32 24
283 | #define R_SPARC_HIPLT22 25
284 | #define R_SPARC_LOPLT10 26
285 | #define R_SPARC_PCPLT32 27
286 | #define R_SPARC_PCPLT22 28
287 | #define R_SPARC_PCPLT10 29
288 | #define R_SPARC_10 30
289 | #define R_SPARC_11 31
290 | #define R_SPARC_64 32
291 | #define R_SPARC_OLO10 33
292 | #define R_SPARC_HH22 34
293 | #define R_SPARC_HM10 35
294 | #define R_SPARC_LM22 36
295 | #define R_SPARC_WDISP16 40
296 | #define R_SPARC_WDISP19 41
297 | #define R_SPARC_7 43
298 | #define R_SPARC_5 44
299 | #define R_SPARC_6 45
300 | /* Bits present in AT_HWCAP, primarily for Sparc32. */
301 | #define HWCAP_SPARC_FLUSH 1 /* CPU supports flush instruction. */
302 | #define HWCAP_SPARC_STBAR 2
303 | #define HWCAP_SPARC_SWAP 4
304 | #define HWCAP_SPARC_MULDIV 8
305 | #define HWCAP_SPARC_V9 16
306 | #define HWCAP_SPARC_ULTRA3 32
307 | /*
308 | * 68k ELF relocation types
309 | */
310 | #define R_68K_NONE 0
311 | #define R_68K_32 1
312 | #define R_68K_16 2
313 | #define R_68K_8 3
314 | #define R_68K_PC32 4
315 | #define R_68K_PC16 5
316 | #define R_68K_PC8 6
317 | #define R_68K_GOT32 7
318 | #define R_68K_GOT16 8
319 | #define R_68K_GOT8 9
320 | #define R_68K_GOT32O 10
321 | #define R_68K_GOT16O 11
322 | #define R_68K_GOT8O 12
323 | #define R_68K_PLT32 13
324 | #define R_68K_PLT16 14
325 | #define R_68K_PLT8 15
326 | #define R_68K_PLT32O 16
327 | #define R_68K_PLT16O 17
328 | #define R_68K_PLT8O 18
329 | #define R_68K_COPY 19
330 | #define R_68K_GLOB_DAT 20
331 | #define R_68K_JMP_SLOT 21
332 | #define R_68K_RELATIVE 22
333 | /*
334 | * Alpha ELF relocation types
335 | */
336 | #define R_ALPHA_NONE 0 /* No reloc */
337 | #define R_ALPHA_REFLONG 1 /* Direct 32 bit */
338 | #define R_ALPHA_REFQUAD 2 /* Direct 64 bit */
339 | #define R_ALPHA_GPREL32 3 /* GP relative 32 bit */
340 | #define R_ALPHA_LITERAL 4 /* GP relative 16 bit w/optimization */
341 | #define R_ALPHA_LITUSE 5 /* Optimization hint for LITERAL */
342 | #define R_ALPHA_GPDISP 6 /* Add displacement to GP */
343 | #define R_ALPHA_BRADDR 7 /* PC+4 relative 23 bit shifted */
344 | #define R_ALPHA_HINT 8 /* PC+4 relative 16 bit shifted */
345 | #define R_ALPHA_SREL16 9 /* PC relative 16 bit */
346 | #define R_ALPHA_SREL32 10 /* PC relative 32 bit */
347 | #define R_ALPHA_SREL64 11 /* PC relative 64 bit */
348 | #define R_ALPHA_GPRELHIGH 17 /* GP relative 32 bit, high 16 bits */
349 | #define R_ALPHA_GPRELLOW 18 /* GP relative 32 bit, low 16 bits */
350 | #define R_ALPHA_GPREL16 19 /* GP relative 16 bit */
351 | #define R_ALPHA_COPY 24 /* Copy symbol at runtime */
352 | #define R_ALPHA_GLOB_DAT 25 /* Create GOT entry */
353 | #define R_ALPHA_JMP_SLOT 26 /* Create PLT entry */
354 | #define R_ALPHA_RELATIVE 27 /* Adjust by program base */
355 | #define R_ALPHA_BRSGP 28
356 | #define R_ALPHA_TLSGD 29
357 | #define R_ALPHA_TLS_LDM 30
358 | #define R_ALPHA_DTPMOD64 31
359 | #define R_ALPHA_GOTDTPREL 32
360 | #define R_ALPHA_DTPREL64 33
361 | #define R_ALPHA_DTPRELHI 34
362 | #define R_ALPHA_DTPRELLO 35
363 | #define R_ALPHA_DTPREL16 36
364 | #define R_ALPHA_GOTTPREL 37
365 | #define R_ALPHA_TPREL64 38
366 | #define R_ALPHA_TPRELHI 39
367 | #define R_ALPHA_TPRELLO 40
368 | #define R_ALPHA_TPREL16 41
369 | #define SHF_ALPHA_GPREL 0x10000000
370 | /* PowerPC relocations defined by the ABIs */
371 | #define R_PPC_NONE 0
372 | #define R_PPC_ADDR32 1 /* 32bit absolute address */
373 | #define R_PPC_ADDR24 2 /* 26bit address, 2 bits ignored. */
374 | #define R_PPC_ADDR16 3 /* 16bit absolute address */
375 | #define R_PPC_ADDR16_LO 4 /* lower 16bit of absolute address */
376 | #define R_PPC_ADDR16_HI 5 /* high 16bit of absolute address */
377 | #define R_PPC_ADDR16_HA 6 /* adjusted high 16bit */
378 | #define R_PPC_ADDR14 7 /* 16bit address, 2 bits ignored */
379 | #define R_PPC_ADDR14_BRTAKEN 8
380 | #define R_PPC_ADDR14_BRNTAKEN 9
381 | #define R_PPC_REL24 10 /* PC relative 26 bit */
382 | #define R_PPC_REL14 11 /* PC relative 16 bit */
383 | #define R_PPC_REL14_BRTAKEN 12
384 | #define R_PPC_REL14_BRNTAKEN 13
385 | #define R_PPC_GOT16 14
386 | #define R_PPC_GOT16_LO 15
387 | #define R_PPC_GOT16_HI 16
388 | #define R_PPC_GOT16_HA 17
389 | #define R_PPC_PLTREL24 18
390 | #define R_PPC_COPY 19
391 | #define R_PPC_GLOB_DAT 20
392 | #define R_PPC_JMP_SLOT 21
393 | #define R_PPC_RELATIVE 22
394 | #define R_PPC_LOCAL24PC 23
395 | #define R_PPC_UADDR32 24
396 | #define R_PPC_UADDR16 25
397 | #define R_PPC_REL32 26
398 | #define R_PPC_PLT32 27
399 | #define R_PPC_PLTREL32 28
400 | #define R_PPC_PLT16_LO 29
401 | #define R_PPC_PLT16_HI 30
402 | #define R_PPC_PLT16_HA 31
403 | #define R_PPC_SDAREL16 32
404 | #define R_PPC_SECTOFF 33
405 | #define R_PPC_SECTOFF_LO 34
406 | #define R_PPC_SECTOFF_HI 35
407 | #define R_PPC_SECTOFF_HA 36
408 | /* Keep this the last entry. */
409 | #define R_PPC_NUM 37
410 | /* ARM specific declarations */
411 | /* Processor specific flags for the ELF header e_flags field. */
412 | #define EF_ARM_RELEXEC 0x01
413 | #define EF_ARM_HASENTRY 0x02
414 | #define EF_ARM_INTERWORK 0x04
415 | #define EF_ARM_APCS_26 0x08
416 | #define EF_ARM_APCS_FLOAT 0x10
417 | #define EF_ARM_PIC 0x20
418 | #define EF_ALIGN8 0x40 /* 8-bit structure alignment is in use */
419 | #define EF_NEW_ABI 0x80
420 | #define EF_OLD_ABI 0x100
421 | /* Additional symbol types for Thumb */
422 | #define STT_ARM_TFUNC 0xd
423 | /* ARM-specific values for sh_flags */
424 | #define SHF_ARM_ENTRYSECT 0x10000000 /* Section contains an entry point */
425 | #define SHF_ARM_COMDEF 0x80000000 /* Section may be multiply defined
426 | in the input to a link step */
427 | /* ARM-specific program header flags */
428 | #define PF_ARM_SB 0x10000000 /* Segment contains the location
429 | addressed by the static base */
430 | /* ARM relocs. */
431 | #define R_ARM_NONE 0 /* No reloc */
432 | #define R_ARM_PC24 1 /* PC relative 26 bit branch */
433 | #define R_ARM_ABS32 2 /* Direct 32 bit */
434 | #define R_ARM_REL32 3 /* PC relative 32 bit */
435 | #define R_ARM_PC13 4
436 | #define R_ARM_ABS16 5 /* Direct 16 bit */
437 | #define R_ARM_ABS12 6 /* Direct 12 bit */
438 | #define R_ARM_THM_ABS5 7
439 | #define R_ARM_ABS8 8 /* Direct 8 bit */
440 | #define R_ARM_SBREL32 9
441 | #define R_ARM_THM_PC22 10
442 | #define R_ARM_THM_PC8 11
443 | #define R_ARM_AMP_VCALL9 12
444 | #define R_ARM_SWI24 13
445 | #define R_ARM_THM_SWI8 14
446 | #define R_ARM_XPC25 15
447 | #define R_ARM_THM_XPC22 16
448 | #define R_ARM_COPY 20 /* Copy symbol at runtime */
449 | #define R_ARM_GLOB_DAT 21 /* Create GOT entry */
450 | #define R_ARM_JUMP_SLOT 22 /* Create PLT entry */
451 | #define R_ARM_RELATIVE 23 /* Adjust by program base */
452 | #define R_ARM_GOTOFF 24 /* 32 bit offset to GOT */
453 | #define R_ARM_GOTPC 25 /* 32 bit PC relative offset to GOT */
454 | #define R_ARM_GOT32 26 /* 32 bit GOT entry */
455 | #define R_ARM_PLT32 27 /* 32 bit PLT address */
456 | #define R_ARM_CALL 28
457 | #define R_ARM_JUMP24 29
458 | #define R_ARM_GNU_VTENTRY 100
459 | #define R_ARM_GNU_VTINHERIT 101
460 | #define R_ARM_THM_PC11 102 /* thumb unconditional branch */
461 | #define R_ARM_THM_PC9 103 /* thumb conditional branch */
462 | #define R_ARM_RXPC25 249
463 | #define R_ARM_RSBREL32 250
464 | #define R_ARM_THM_RPC22 251
465 | #define R_ARM_RREL32 252
466 | #define R_ARM_RABS22 253
467 | #define R_ARM_RPC24 254
468 | #define R_ARM_RBASE 255
469 | /* Keep this the last entry. */
470 | #define R_ARM_NUM 256
471 | /* s390 relocations defined by the ABIs */
472 | #define R_390_NONE 0 /* No reloc. */
473 | #define R_390_8 1 /* Direct 8 bit. */
474 | #define R_390_12 2 /* Direct 12 bit. */
475 | #define R_390_16 3 /* Direct 16 bit. */
476 | #define R_390_32 4 /* Direct 32 bit. */
477 | #define R_390_PC32 5 /* PC relative 32 bit. */
478 | #define R_390_GOT12 6 /* 12 bit GOT offset. */
479 | #define R_390_GOT32 7 /* 32 bit GOT offset. */
480 | #define R_390_PLT32 8 /* 32 bit PC relative PLT address. */
481 | #define R_390_COPY 9 /* Copy symbol at runtime. */
482 | #define R_390_GLOB_DAT 10 /* Create GOT entry. */
483 | #define R_390_JMP_SLOT 11 /* Create PLT entry. */
484 | #define R_390_RELATIVE 12 /* Adjust by program base. */
485 | #define R_390_GOTOFF32 13 /* 32 bit offset to GOT. */
486 | #define R_390_GOTPC 14 /* 32 bit PC rel. offset to GOT. */
487 | #define R_390_GOT16 15 /* 16 bit GOT offset. */
488 | #define R_390_PC16 16 /* PC relative 16 bit. */
489 | #define R_390_PC16DBL 17 /* PC relative 16 bit shifted by 1. */
490 | #define R_390_PLT16DBL 18 /* 16 bit PC rel. PLT shifted by 1. */
491 | #define R_390_PC32DBL 19 /* PC relative 32 bit shifted by 1. */
492 | #define R_390_PLT32DBL 20 /* 32 bit PC rel. PLT shifted by 1. */
493 | #define R_390_GOTPCDBL 21 /* 32 bit PC rel. GOT shifted by 1. */
494 | #define R_390_64 22 /* Direct 64 bit. */
495 | #define R_390_PC64 23 /* PC relative 64 bit. */
496 | #define R_390_GOT64 24 /* 64 bit GOT offset. */
497 | #define R_390_PLT64 25 /* 64 bit PC relative PLT address. */
498 | #define R_390_GOTENT 26 /* 32 bit PC rel. to GOT entry >> 1. */
499 | #define R_390_GOTOFF16 27 /* 16 bit offset to GOT. */
500 | #define R_390_GOTOFF64 28 /* 64 bit offset to GOT. */
501 | #define R_390_GOTPLT12 29 /* 12 bit offset to jump slot. */
502 | #define R_390_GOTPLT16 30 /* 16 bit offset to jump slot. */
503 | #define R_390_GOTPLT32 31 /* 32 bit offset to jump slot. */
504 | #define R_390_GOTPLT64 32 /* 64 bit offset to jump slot. */
505 | #define R_390_GOTPLTENT 33 /* 32 bit rel. offset to jump slot. */
506 | #define R_390_PLTOFF16 34 /* 16 bit offset from GOT to PLT. */
507 | #define R_390_PLTOFF32 35 /* 32 bit offset from GOT to PLT. */
508 | #define R_390_PLTOFF64 36 /* 16 bit offset from GOT to PLT. */
509 | #define R_390_TLS_LOAD 37 /* Tag for load insn in TLS code. */
510 | #define R_390_TLS_GDCALL 38 /* Tag for function call in general
511 | dynamic TLS code. */
512 | #define R_390_TLS_LDCALL 39 /* Tag for function call in local
513 | dynamic TLS code. */
514 | #define R_390_TLS_GD32 40 /* Direct 32 bit for general dynamic
515 | thread local data. */
516 | #define R_390_TLS_GD64 41 /* Direct 64 bit for general dynamic
517 | thread local data. */
518 | #define R_390_TLS_GOTIE12 42 /* 12 bit GOT offset for static TLS
519 | block offset. */
520 | #define R_390_TLS_GOTIE32 43 /* 32 bit GOT offset for static TLS
521 | block offset. */
522 | #define R_390_TLS_GOTIE64 44 /* 64 bit GOT offset for static TLS
523 | block offset. */
524 | #define R_390_TLS_LDM32 45 /* Direct 32 bit for local dynamic
525 | thread local data in LD code. */
526 | #define R_390_TLS_LDM64 46 /* Direct 64 bit for local dynamic
527 | thread local data in LD code. */
528 | #define R_390_TLS_IE32 47 /* 32 bit address of GOT entry for
529 | negated static TLS block offset. */
530 | #define R_390_TLS_IE64 48 /* 64 bit address of GOT entry for
531 | negated static TLS block offset. */
532 | #define R_390_TLS_IEENT 49 /* 32 bit rel. offset to GOT entry for
533 | negated static TLS block offset. */
534 | #define R_390_TLS_LE32 50 /* 32 bit negated offset relative to
535 | static TLS block. */
536 | #define R_390_TLS_LE64 51 /* 64 bit negated offset relative to
537 | static TLS block. */
538 | #define R_390_TLS_LDO32 52 /* 32 bit offset relative to TLS
539 | block. */
540 | #define R_390_TLS_LDO64 53 /* 64 bit offset relative to TLS
541 | block. */
542 | #define R_390_TLS_DTPMOD 54 /* ID of module containing symbol. */
543 | #define R_390_TLS_DTPOFF 55 /* Offset in TLS block. */
544 | #define R_390_TLS_TPOFF 56 /* Negate offset in static TLS
545 | block. */
546 | /* Keep this the last entry. */
547 | #define R_390_NUM 57
548 | /* x86-64 relocation types */
549 | #define R_X86_64_NONE 0 /* No reloc */
550 | #define R_X86_64_64 1 /* Direct 64 bit */
551 | #define R_X86_64_PC32 2 /* PC relative 32 bit signed */
552 | #define R_X86_64_GOT32 3 /* 32 bit GOT entry */
553 | #define R_X86_64_PLT32 4 /* 32 bit PLT address */
554 | #define R_X86_64_COPY 5 /* Copy symbol at runtime */
555 | #define R_X86_64_GLOB_DAT 6 /* Create GOT entry */
556 | #define R_X86_64_JUMP_SLOT 7 /* Create PLT entry */
557 | #define R_X86_64_RELATIVE 8 /* Adjust by program base */
558 | #define R_X86_64_GOTPCREL 9 /* 32 bit signed pc relative
559 | offset to GOT */
560 | #define R_X86_64_32 10 /* Direct 32 bit zero extended */
561 | #define R_X86_64_32S 11 /* Direct 32 bit sign extended */
562 | #define R_X86_64_16 12 /* Direct 16 bit zero extended */
563 | #define R_X86_64_PC16 13 /* 16 bit sign extended pc relative */
564 | #define R_X86_64_8 14 /* Direct 8 bit sign extended */
565 | #define R_X86_64_PC8 15 /* 8 bit sign extended pc relative */
566 | #define R_X86_64_NUM 16
567 | /* Legal values for e_flags field of Elf64_Ehdr. */
568 | #define EF_ALPHA_32BIT 1 /* All addresses are below 2GB */
569 | /* HPPA specific definitions. */
570 | /* Legal values for e_flags field of Elf32_Ehdr. */
571 | #define EF_PARISC_TRAPNIL 0x00010000 /* Trap nil pointer dereference. */
572 | #define EF_PARISC_EXT 0x00020000 /* Program uses arch. extensions. */
573 | #define EF_PARISC_LSB 0x00040000 /* Program expects little endian. */
574 | #define EF_PARISC_WIDE 0x00080000 /* Program expects wide mode. */
575 | #define EF_PARISC_NO_KABP 0x00100000 /* No kernel assisted branch
576 | prediction. */
577 | #define EF_PARISC_LAZYSWAP 0x00400000 /* Allow lazy swapping. */
578 | #define EF_PARISC_ARCH 0x0000ffff /* Architecture version. */
579 | /* Defined values for `e_flags & EF_PARISC_ARCH' are: */
580 | #define EFA_PARISC_1_0 0x020b /* PA-RISC 1.0 big-endian. */
581 | #define EFA_PARISC_1_1 0x0210 /* PA-RISC 1.1 big-endian. */
582 | #define EFA_PARISC_2_0 0x0214 /* PA-RISC 2.0 big-endian. */
583 | /* Additional section indeces. */
584 | #define SHN_PARISC_ANSI_COMMON 0xff00 /* Section for tenatively declared
585 | symbols in ANSI C. */
586 | #define SHN_PARISC_HUGE_COMMON 0xff01 /* Common blocks in huge model. */
587 | /* Legal values for sh_type field of Elf32_Shdr. */
588 | #define SHT_PARISC_EXT 0x70000000 /* Contains product specific ext. */
589 | #define SHT_PARISC_UNWIND 0x70000001 /* Unwind information. */
590 | #define SHT_PARISC_DOC 0x70000002 /* Debug info for optimized code. */
591 | /* Legal values for sh_flags field of Elf32_Shdr. */
592 | #define SHF_PARISC_SHORT 0x20000000 /* Section with short addressing. */
593 | #define SHF_PARISC_HUGE 0x40000000 /* Section far from gp. */
594 | #define SHF_PARISC_SBP 0x80000000 /* Static branch prediction code. */
595 | /* Legal values for ST_TYPE subfield of st_info (symbol type). */
596 | #define STT_PARISC_MILLICODE 13 /* Millicode function entry point. */
597 | #define STT_HP_OPAQUE (STT_LOOS + 0x1)
598 | #define STT_HP_STUB (STT_LOOS + 0x2)
599 | /* HPPA relocs. */
600 | #define R_PARISC_NONE 0 /* No reloc. */
601 | #define R_PARISC_DIR32 1 /* Direct 32-bit reference. */
602 | #define R_PARISC_DIR21L 2 /* Left 21 bits of eff. address. */
603 | #define R_PARISC_DIR17R 3 /* Right 17 bits of eff. address. */
604 | #define R_PARISC_DIR17F 4 /* 17 bits of eff. address. */
605 | #define R_PARISC_DIR14R 6 /* Right 14 bits of eff. address. */
606 | #define R_PARISC_PCREL32 9 /* 32-bit rel. address. */
607 | #define R_PARISC_PCREL21L 10 /* Left 21 bits of rel. address. */
608 | #define R_PARISC_PCREL17R 11 /* Right 17 bits of rel. address. */
609 | #define R_PARISC_PCREL17F 12 /* 17 bits of rel. address. */
610 | #define R_PARISC_PCREL14R 14 /* Right 14 bits of rel. address. */
611 | #define R_PARISC_DPREL21L 18 /* Left 21 bits of rel. address. */
612 | #define R_PARISC_DPREL14R 22 /* Right 14 bits of rel. address. */
613 | #define R_PARISC_GPREL21L 26 /* GP-relative, left 21 bits. */
614 | #define R_PARISC_GPREL14R 30 /* GP-relative, right 14 bits. */
615 | #define R_PARISC_LTOFF21L 34 /* LT-relative, left 21 bits. */
616 | #define R_PARISC_LTOFF14R 38 /* LT-relative, right 14 bits. */
617 | #define R_PARISC_SECREL32 41 /* 32 bits section rel. address. */
618 | #define R_PARISC_SEGBASE 48 /* No relocation, set segment base. */
619 | #define R_PARISC_SEGREL32 49 /* 32 bits segment rel. address. */
620 | #define R_PARISC_PLTOFF21L 50 /* PLT rel. address, left 21 bits. */
621 | #define R_PARISC_PLTOFF14R 54 /* PLT rel. address, right 14 bits. */
622 | #define R_PARISC_LTOFF_FPTR32 57 /* 32 bits LT-rel. function pointer. */
623 | #define R_PARISC_LTOFF_FPTR21L 58 /* LT-rel. fct ptr, left 21 bits. */
624 | #define R_PARISC_LTOFF_FPTR14R 62 /* LT-rel. fct ptr, right 14 bits. */
625 | #define R_PARISC_FPTR64 64 /* 64 bits function address. */
626 | #define R_PARISC_PLABEL32 65 /* 32 bits function address. */
627 | #define R_PARISC_PCREL64 72 /* 64 bits PC-rel. address. */
628 | #define R_PARISC_PCREL22F 74 /* 22 bits PC-rel. address. */
629 | #define R_PARISC_PCREL14WR 75 /* PC-rel. address, right 14 bits. */
630 | #define R_PARISC_PCREL14DR 76 /* PC rel. address, right 14 bits. */
631 | #define R_PARISC_PCREL16F 77 /* 16 bits PC-rel. address. */
632 | #define R_PARISC_PCREL16WF 78 /* 16 bits PC-rel. address. */
633 | #define R_PARISC_PCREL16DF 79 /* 16 bits PC-rel. address. */
634 | #define R_PARISC_DIR64 80 /* 64 bits of eff. address. */
635 | #define R_PARISC_DIR14WR 83 /* 14 bits of eff. address. */
636 | #define R_PARISC_DIR14DR 84 /* 14 bits of eff. address. */
637 | #define R_PARISC_DIR16F 85 /* 16 bits of eff. address. */
638 | #define R_PARISC_DIR16WF 86 /* 16 bits of eff. address. */
639 | #define R_PARISC_DIR16DF 87 /* 16 bits of eff. address. */
640 | #define R_PARISC_GPREL64 88 /* 64 bits of GP-rel. address. */
641 | #define R_PARISC_GPREL14WR 91 /* GP-rel. address, right 14 bits. */
642 | #define R_PARISC_GPREL14DR 92 /* GP-rel. address, right 14 bits. */
643 | #define R_PARISC_GPREL16F 93 /* 16 bits GP-rel. address. */
644 | #define R_PARISC_GPREL16WF 94 /* 16 bits GP-rel. address. */
645 | #define R_PARISC_GPREL16DF 95 /* 16 bits GP-rel. address. */
646 | #define R_PARISC_LTOFF64 96 /* 64 bits LT-rel. address. */
647 | #define R_PARISC_LTOFF14WR 99 /* LT-rel. address, right 14 bits. */
648 | #define R_PARISC_LTOFF14DR 100 /* LT-rel. address, right 14 bits. */
649 | #define R_PARISC_LTOFF16F 101 /* 16 bits LT-rel. address. */
650 | #define R_PARISC_LTOFF16WF 102 /* 16 bits LT-rel. address. */
651 | #define R_PARISC_LTOFF16DF 103 /* 16 bits LT-rel. address. */
652 | #define R_PARISC_SECREL64 104 /* 64 bits section rel. address. */
653 | #define R_PARISC_SEGREL64 112 /* 64 bits segment rel. address. */
654 | #define R_PARISC_PLTOFF14WR 115 /* PLT-rel. address, right 14 bits. */
655 | #define R_PARISC_PLTOFF14DR 116 /* PLT-rel. address, right 14 bits. */
656 | #define R_PARISC_PLTOFF16F 117 /* 16 bits LT-rel. address. */
657 | #define R_PARISC_PLTOFF16WF 118 /* 16 bits PLT-rel. address. */
658 | #define R_PARISC_PLTOFF16DF 119 /* 16 bits PLT-rel. address. */
659 | #define R_PARISC_LTOFF_FPTR64 120 /* 64 bits LT-rel. function ptr. */
660 | #define R_PARISC_LTOFF_FPTR14WR 123 /* LT-rel. fct. ptr., right 14 bits. */
661 | #define R_PARISC_LTOFF_FPTR14DR 124 /* LT-rel. fct. ptr., right 14 bits. */
662 | #define R_PARISC_LTOFF_FPTR16F 125 /* 16 bits LT-rel. function ptr. */
663 | #define R_PARISC_LTOFF_FPTR16WF 126 /* 16 bits LT-rel. function ptr. */
664 | #define R_PARISC_LTOFF_FPTR16DF 127 /* 16 bits LT-rel. function ptr. */
665 | #define R_PARISC_LORESERVE 128
666 | #define R_PARISC_COPY 128 /* Copy relocation. */
667 | #define R_PARISC_IPLT 129 /* Dynamic reloc, imported PLT */
668 | #define R_PARISC_EPLT 130 /* Dynamic reloc, exported PLT */
669 | #define R_PARISC_TPREL32 153 /* 32 bits TP-rel. address. */
670 | #define R_PARISC_TPREL21L 154 /* TP-rel. address, left 21 bits. */
671 | #define R_PARISC_TPREL14R 158 /* TP-rel. address, right 14 bits. */
672 | #define R_PARISC_LTOFF_TP21L 162 /* LT-TP-rel. address, left 21 bits. */
673 | #define R_PARISC_LTOFF_TP14R 166 /* LT-TP-rel. address, right 14 bits.*/
674 | #define R_PARISC_LTOFF_TP14F 167 /* 14 bits LT-TP-rel. address. */
675 | #define R_PARISC_TPREL64 216 /* 64 bits TP-rel. address. */
676 | #define R_PARISC_TPREL14WR 219 /* TP-rel. address, right 14 bits. */
677 | #define R_PARISC_TPREL14DR 220 /* TP-rel. address, right 14 bits. */
678 | #define R_PARISC_TPREL16F 221 /* 16 bits TP-rel. address. */
679 | #define R_PARISC_TPREL16WF 222 /* 16 bits TP-rel. address. */
680 | #define R_PARISC_TPREL16DF 223 /* 16 bits TP-rel. address. */
681 | #define R_PARISC_LTOFF_TP64 224 /* 64 bits LT-TP-rel. address. */
682 | #define R_PARISC_LTOFF_TP14WR 227 /* LT-TP-rel. address, right 14 bits.*/
683 | #define R_PARISC_LTOFF_TP14DR 228 /* LT-TP-rel. address, right 14 bits.*/
684 | #define R_PARISC_LTOFF_TP16F 229 /* 16 bits LT-TP-rel. address. */
685 | #define R_PARISC_LTOFF_TP16WF 230 /* 16 bits LT-TP-rel. address. */
686 | #define R_PARISC_LTOFF_TP16DF 231 /* 16 bits LT-TP-rel. address. */
687 | #define R_PARISC_HIRESERVE 255
688 | /* Legal values for p_type field of Elf32_Phdr/Elf64_Phdr. */
689 | #define PT_HP_TLS (PT_LOOS + 0x0)
690 | #define PT_HP_CORE_NONE (PT_LOOS + 0x1)
691 | #define PT_HP_CORE_VERSION (PT_LOOS + 0x2)
692 | #define PT_HP_CORE_KERNEL (PT_LOOS + 0x3)
693 | #define PT_HP_CORE_COMM (PT_LOOS + 0x4)
694 | #define PT_HP_CORE_PROC (PT_LOOS + 0x5)
695 | #define PT_HP_CORE_LOADABLE (PT_LOOS + 0x6)
696 | #define PT_HP_CORE_STACK (PT_LOOS + 0x7)
697 | #define PT_HP_CORE_SHM (PT_LOOS + 0x8)
698 | #define PT_HP_CORE_MMF (PT_LOOS + 0x9)
699 | #define PT_HP_PARALLEL (PT_LOOS + 0x10)
700 | #define PT_HP_FASTBIND (PT_LOOS + 0x11)
701 | #define PT_HP_OPT_ANNOT (PT_LOOS + 0x12)
702 | #define PT_HP_HSL_ANNOT (PT_LOOS + 0x13)
703 | #define PT_HP_STACK (PT_LOOS + 0x14)
704 | #define PT_PARISC_ARCHEXT 0x70000000
705 | #define PT_PARISC_UNWIND 0x70000001
706 | /* Legal values for p_flags field of Elf32_Phdr/Elf64_Phdr. */
707 | #define PF_PARISC_SBP 0x08000000
708 | #define PF_HP_PAGE_SIZE 0x00100000
709 | #define PF_HP_FAR_SHARED 0x00200000
710 | #define PF_HP_NEAR_SHARED 0x00400000
711 | #define PF_HP_CODE 0x01000000
712 | #define PF_HP_MODIFY 0x02000000
713 | #define PF_HP_LAZYSWAP 0x04000000
714 | #define PF_HP_SBP 0x08000000
715 | /* IA-64 specific declarations. */
716 | /* Processor specific flags for the Ehdr e_flags field. */
717 | #define EF_IA_64_MASKOS 0x0000000f /* os-specific flags */
718 | #define EF_IA_64_ABI64 0x00000010 /* 64-bit ABI */
719 | #define EF_IA_64_ARCH 0xff000000 /* arch. version mask */
720 | /* Processor specific values for the Phdr p_type field. */
721 | #define PT_IA_64_ARCHEXT (PT_LOPROC + 0) /* arch extension bits */
722 | #define PT_IA_64_UNWIND (PT_LOPROC + 1) /* ia64 unwind bits */
723 | /* Processor specific flags for the Phdr p_flags field. */
724 | #define PF_IA_64_NORECOV 0x80000000 /* spec insns w/o recovery */
725 | /* Processor specific values for the Shdr sh_type field. */
726 | #define SHT_IA_64_EXT (SHT_LOPROC + 0) /* extension bits */
727 | #define SHT_IA_64_UNWIND (SHT_LOPROC + 1) /* unwind bits */
728 | /* Processor specific flags for the Shdr sh_flags field. */
729 | #define SHF_IA_64_SHORT 0x10000000 /* section near gp */
730 | #define SHF_IA_64_NORECOV 0x20000000 /* spec insns w/o recovery */
731 | /* Processor specific values for the Dyn d_tag field. */
732 | #define DT_IA_64_PLT_RESERVE (DT_LOPROC + 0)
733 | #define DT_IA_64_NUM 1
734 | /* IA-64 relocations. */
735 | #define R_IA64_NONE 0x00 /* none */
736 | #define R_IA64_IMM14 0x21 /* symbol + addend, add imm14 */
737 | #define R_IA64_IMM22 0x22 /* symbol + addend, add imm22 */
738 | #define R_IA64_IMM64 0x23 /* symbol + addend, mov imm64 */
739 | #define R_IA64_DIR32MSB 0x24 /* symbol + addend, data4 MSB */
740 | #define R_IA64_DIR32LSB 0x25 /* symbol + addend, data4 LSB */
741 | #define R_IA64_DIR64MSB 0x26 /* symbol + addend, data8 MSB */
742 | #define R_IA64_DIR64LSB 0x27 /* symbol + addend, data8 LSB */
743 | #define R_IA64_GPREL22 0x2a /* @gprel(sym + add), add imm22 */
744 | #define R_IA64_GPREL64I 0x2b /* @gprel(sym + add), mov imm64 */
745 | #define R_IA64_GPREL32MSB 0x2c /* @gprel(sym + add), data4 MSB */
746 | #define R_IA64_GPREL32LSB 0x2d /* @gprel(sym + add), data4 LSB */
747 | #define R_IA64_GPREL64MSB 0x2e /* @gprel(sym + add), data8 MSB */
748 | #define R_IA64_GPREL64LSB 0x2f /* @gprel(sym + add), data8 LSB */
749 | #define R_IA64_LTOFF22 0x32 /* @ltoff(sym + add), add imm22 */
750 | #define R_IA64_LTOFF64I 0x33 /* @ltoff(sym + add), mov imm64 */
751 | #define R_IA64_PLTOFF22 0x3a /* @pltoff(sym + add), add imm22 */
752 | #define R_IA64_PLTOFF64I 0x3b /* @pltoff(sym + add), mov imm64 */
753 | #define R_IA64_PLTOFF64MSB 0x3e /* @pltoff(sym + add), data8 MSB */
754 | #define R_IA64_PLTOFF64LSB 0x3f /* @pltoff(sym + add), data8 LSB */
755 | #define R_IA64_FPTR64I 0x43 /* @fptr(sym + add), mov imm64 */
756 | #define R_IA64_FPTR32MSB 0x44 /* @fptr(sym + add), data4 MSB */
757 | #define R_IA64_FPTR32LSB 0x45 /* @fptr(sym + add), data4 LSB */
758 | #define R_IA64_FPTR64MSB 0x46 /* @fptr(sym + add), data8 MSB */
759 | #define R_IA64_FPTR64LSB 0x47 /* @fptr(sym + add), data8 LSB */
760 | #define R_IA64_PCREL60B 0x48 /* @pcrel(sym + add), brl */
761 | #define R_IA64_PCREL21B 0x49 /* @pcrel(sym + add), ptb, call */
762 | #define R_IA64_PCREL21M 0x4a /* @pcrel(sym + add), chk.s */
763 | #define R_IA64_PCREL21F 0x4b /* @pcrel(sym + add), fchkf */
764 | #define R_IA64_PCREL32MSB 0x4c /* @pcrel(sym + add), data4 MSB */
765 | #define R_IA64_PCREL32LSB 0x4d /* @pcrel(sym + add), data4 LSB */
766 | #define R_IA64_PCREL64MSB 0x4e /* @pcrel(sym + add), data8 MSB */
767 | #define R_IA64_PCREL64LSB 0x4f /* @pcrel(sym + add), data8 LSB */
768 | #define R_IA64_LTOFF_FPTR22 0x52 /* @ltoff(@fptr(s+a)), imm22 */
769 | #define R_IA64_LTOFF_FPTR64I 0x53 /* @ltoff(@fptr(s+a)), imm64 */
770 | #define R_IA64_LTOFF_FPTR32MSB 0x54 /* @ltoff(@fptr(s+a)), data4 MSB */
771 | #define R_IA64_LTOFF_FPTR32LSB 0x55 /* @ltoff(@fptr(s+a)), data4 LSB */
772 | #define R_IA64_LTOFF_FPTR64MSB 0x56 /* @ltoff(@fptr(s+a)), data8 MSB */
773 | #define R_IA64_LTOFF_FPTR64LSB 0x57 /* @ltoff(@fptr(s+a)), data8 LSB */
774 | #define R_IA64_SEGREL32MSB 0x5c /* @segrel(sym + add), data4 MSB */
775 | #define R_IA64_SEGREL32LSB 0x5d /* @segrel(sym + add), data4 LSB */
776 | #define R_IA64_SEGREL64MSB 0x5e /* @segrel(sym + add), data8 MSB */
777 | #define R_IA64_SEGREL64LSB 0x5f /* @segrel(sym + add), data8 LSB */
778 | #define R_IA64_SECREL32MSB 0x64 /* @secrel(sym + add), data4 MSB */
779 | #define R_IA64_SECREL32LSB 0x65 /* @secrel(sym + add), data4 LSB */
780 | #define R_IA64_SECREL64MSB 0x66 /* @secrel(sym + add), data8 MSB */
781 | #define R_IA64_SECREL64LSB 0x67 /* @secrel(sym + add), data8 LSB */
782 | #define R_IA64_REL32MSB 0x6c /* data 4 + REL */
783 | #define R_IA64_REL32LSB 0x6d /* data 4 + REL */
784 | #define R_IA64_REL64MSB 0x6e /* data 8 + REL */
785 | #define R_IA64_REL64LSB 0x6f /* data 8 + REL */
786 | #define R_IA64_LTV32MSB 0x74 /* symbol + addend, data4 MSB */
787 | #define R_IA64_LTV32LSB 0x75 /* symbol + addend, data4 LSB */
788 | #define R_IA64_LTV64MSB 0x76 /* symbol + addend, data8 MSB */
789 | #define R_IA64_LTV64LSB 0x77 /* symbol + addend, data8 LSB */
790 | #define R_IA64_PCREL21BI 0x79 /* @pcrel(sym + add), 21bit inst */
791 | #define R_IA64_PCREL22 0x7a /* @pcrel(sym + add), 22bit inst */
792 | #define R_IA64_PCREL64I 0x7b /* @pcrel(sym + add), 64bit inst */
793 | #define R_IA64_IPLTMSB 0x80 /* dynamic reloc, imported PLT, MSB */
794 | #define R_IA64_IPLTLSB 0x81 /* dynamic reloc, imported PLT, LSB */
795 | #define R_IA64_COPY 0x84 /* copy relocation */
796 | #define R_IA64_SUB 0x85 /* Addend and symbol difference */
797 | #define R_IA64_LTOFF22X 0x86 /* LTOFF22, relaxable. */
798 | #define R_IA64_LDXMOV 0x87 /* Use of LTOFF22X. */
799 | #define R_IA64_TPREL14 0x91 /* @tprel(sym + add), imm14 */
800 | #define R_IA64_TPREL22 0x92 /* @tprel(sym + add), imm22 */
801 | #define R_IA64_TPREL64I 0x93 /* @tprel(sym + add), imm64 */
802 | #define R_IA64_TPREL64MSB 0x96 /* @tprel(sym + add), data8 MSB */
803 | #define R_IA64_TPREL64LSB 0x97 /* @tprel(sym + add), data8 LSB */
804 | #define R_IA64_LTOFF_TPREL22 0x9a /* @ltoff(@tprel(s+a)), imm2 */
805 | #define R_IA64_DTPMOD64MSB 0xa6 /* @dtpmod(sym + add), data8 MSB */
806 | #define R_IA64_DTPMOD64LSB 0xa7 /* @dtpmod(sym + add), data8 LSB */
807 | #define R_IA64_LTOFF_DTPMOD22 0xaa /* @ltoff(@dtpmod(sym + add)), imm22 */
808 | #define R_IA64_DTPREL14 0xb1 /* @dtprel(sym + add), imm14 */
809 | #define R_IA64_DTPREL22 0xb2 /* @dtprel(sym + add), imm22 */
810 | #define R_IA64_DTPREL64I 0xb3 /* @dtprel(sym + add), imm64 */
811 | #define R_IA64_DTPREL32MSB 0xb4 /* @dtprel(sym + add), data4 MSB */
812 | #define R_IA64_DTPREL32LSB 0xb5 /* @dtprel(sym + add), data4 LSB */
813 | #define R_IA64_DTPREL64MSB 0xb6 /* @dtprel(sym + add), data8 MSB */
814 | #define R_IA64_DTPREL64LSB 0xb7 /* @dtprel(sym + add), data8 LSB */
815 | #define R_IA64_LTOFF_DTPREL22 0xba /* @ltoff(@dtprel(s+a)), imm22 */
816 | typedef struct elf32_rel {
817 | Elf32_Addr r_offset;
818 | Elf32_Word r_info;
819 | } Elf32_Rel;
820 | typedef struct elf64_rel {
821 | Elf64_Addr r_offset; /* Location at which to apply the action */
822 | Elf64_Xword r_info; /* index and type of relocation */
823 | } Elf64_Rel;
824 | typedef struct elf32_rela{
825 | Elf32_Addr r_offset;
826 | Elf32_Word r_info;
827 | Elf32_Sword r_addend;
828 | } Elf32_Rela;
829 | typedef struct elf64_rela {
830 | Elf64_Addr r_offset; /* Location at which to apply the action */
831 | Elf64_Xword r_info; /* index and type of relocation */
832 | Elf64_Sxword r_addend; /* Constant addend used to compute value */
833 | } Elf64_Rela;
834 | typedef struct elf32_sym{
835 | Elf32_Word st_name;
836 | Elf32_Addr st_value;
837 | Elf32_Word st_size;
838 | unsigned char st_info;
839 | unsigned char st_other;
840 | Elf32_Half st_shndx;
841 | } Elf32_Sym;
842 | typedef struct elf64_sym {
843 | Elf64_Word st_name; /* Symbol name, index in string tbl */
844 | unsigned char st_info; /* Type and binding attributes */
845 | unsigned char st_other; /* No defined meaning, 0 */
846 | Elf64_Half st_shndx; /* Associated section index */
847 | Elf64_Addr st_value; /* Value of the symbol */
848 | Elf64_Xword st_size; /* Associated symbol size */
849 | } Elf64_Sym;
850 | #define EI_NIDENT 16
851 | typedef struct elf32_hdr{
852 | unsigned char e_ident[EI_NIDENT];
853 | Elf32_Half e_type;
854 | Elf32_Half e_machine;
855 | Elf32_Word e_version;
856 | Elf32_Addr e_entry; /* Entry point */
857 | Elf32_Off e_phoff;
858 | Elf32_Off e_shoff;
859 | Elf32_Word e_flags;
860 | Elf32_Half e_ehsize;
861 | Elf32_Half e_phentsize;
862 | Elf32_Half e_phnum;
863 | Elf32_Half e_shentsize;
864 | Elf32_Half e_shnum;
865 | Elf32_Half e_shstrndx;
866 | } Elf32_Ehdr;
867 | typedef struct elf64_hdr {
868 | unsigned char e_ident[16]; /* ELF "magic number" */
869 | Elf64_Half e_type;
870 | Elf64_Half e_machine;
871 | Elf64_Word e_version;
872 | Elf64_Addr e_entry; /* Entry point virtual address */
873 | Elf64_Off e_phoff; /* Program header table file offset */
874 | Elf64_Off e_shoff; /* Section header table file offset */
875 | Elf64_Word e_flags;
876 | Elf64_Half e_ehsize;
877 | Elf64_Half e_phentsize;
878 | Elf64_Half e_phnum;
879 | Elf64_Half e_shentsize;
880 | Elf64_Half e_shnum;
881 | Elf64_Half e_shstrndx;
882 | } Elf64_Ehdr;
883 | /* These constants define the permissions on sections in the program
884 | header, p_flags. */
885 | #define PF_R 0x4
886 | #define PF_W 0x2
887 | #define PF_X 0x1
888 | typedef struct elf32_phdr{
889 | Elf32_Word p_type;
890 | Elf32_Off p_offset;
891 | Elf32_Addr p_vaddr;
892 | Elf32_Addr p_paddr;
893 | Elf32_Word p_filesz;
894 | Elf32_Word p_memsz;
895 | Elf32_Word p_flags;
896 | Elf32_Word p_align;
897 | } Elf32_Phdr;
898 | typedef struct elf64_phdr {
899 | Elf64_Word p_type;
900 | Elf64_Word p_flags;
901 | Elf64_Off p_offset; /* Segment file offset */
902 | Elf64_Addr p_vaddr; /* Segment virtual address */
903 | Elf64_Addr p_paddr; /* Segment physical address */
904 | Elf64_Xword p_filesz; /* Segment size in file */
905 | Elf64_Xword p_memsz; /* Segment size in memory */
906 | Elf64_Xword p_align; /* Segment alignment, file & memory */
907 | } Elf64_Phdr;
908 | /* sh_type */
909 | #define SHT_NULL 0
910 | #define SHT_PROGBITS 1
911 | #define SHT_SYMTAB 2
912 | #define SHT_STRTAB 3
913 | #define SHT_RELA 4
914 | #define SHT_HASH 5
915 | #define SHT_DYNAMIC 6
916 | #define SHT_NOTE 7
917 | #define SHT_NOBITS 8
918 | #define SHT_REL 9
919 | #define SHT_SHLIB 10
920 | #define SHT_DYNSYM 11
921 | #define SHT_NUM 12
922 | #define SHT_LOPROC 0x70000000
923 | #define SHT_HIPROC 0x7fffffff
924 | #define SHT_LOUSER 0x80000000
925 | #define SHT_HIUSER 0xffffffff
926 | #define SHT_MIPS_LIST 0x70000000
927 | #define SHT_MIPS_CONFLICT 0x70000002
928 | #define SHT_MIPS_GPTAB 0x70000003
929 | #define SHT_MIPS_UCODE 0x70000004
930 | /* sh_flags */
931 | #define SHF_WRITE 0x1
932 | #define SHF_ALLOC 0x2
933 | #define SHF_EXECINSTR 0x4
934 | #define SHF_MASKPROC 0xf0000000
935 | #define SHF_MIPS_GPREL 0x10000000
936 | /* special section indexes */
937 | #define SHN_UNDEF 0
938 | #define SHN_LORESERVE 0xff00
939 | #define SHN_LOPROC 0xff00
940 | #define SHN_HIPROC 0xff1f
941 | #define SHN_ABS 0xfff1
942 | #define SHN_COMMON 0xfff2
943 | #define SHN_HIRESERVE 0xffff
944 | #define SHN_MIPS_ACCOMON 0xff00
945 | typedef struct elf32_shdr {
946 | Elf32_Word sh_name;
947 | Elf32_Word sh_type;
948 | Elf32_Word sh_flags;
949 | Elf32_Addr sh_addr;
950 | Elf32_Off sh_offset;
951 | Elf32_Word sh_size;
952 | Elf32_Word sh_link;
953 | Elf32_Word sh_info;
954 | Elf32_Word sh_addralign;
955 | Elf32_Word sh_entsize;
956 | } Elf32_Shdr;
957 | typedef struct elf64_shdr {
958 | Elf64_Word sh_name; /* Section name, index in string tbl */
959 | Elf64_Word sh_type; /* Type of section */
960 | Elf64_Xword sh_flags; /* Miscellaneous section attributes */
961 | Elf64_Addr sh_addr; /* Section virtual addr at execution */
962 | Elf64_Off sh_offset; /* Section file offset */
963 | Elf64_Xword sh_size; /* Size of section in bytes */
964 | Elf64_Word sh_link; /* Index of another section */
965 | Elf64_Word sh_info; /* Additional section information */
966 | Elf64_Xword sh_addralign; /* Section alignment */
967 | Elf64_Xword sh_entsize; /* Entry size if section holds table */
968 | } Elf64_Shdr;
969 | #define EI_MAG0 0 /* e_ident[] indexes */
970 | #define EI_MAG1 1
971 | #define EI_MAG2 2
972 | #define EI_MAG3 3
973 | #define EI_CLASS 4
974 | #define EI_DATA 5
975 | #define EI_VERSION 6
976 | #define EI_PAD 7
977 | #define ELFMAG0 0x7f /* EI_MAG */
978 | #define ELFMAG1 'E'
979 | #define ELFMAG2 'L'
980 | #define ELFMAG3 'F'
981 | #define ELFMAG "177ELF"
982 | #define SELFMAG 4
983 | #define ELFCLASSNONE 0 /* EI_CLASS */
984 | #define ELFCLASS32 1
985 | #define ELFCLASS64 2
986 | #define ELFCLASSNUM 3
987 | #define ELFDATANONE 0 /* e_ident[EI_DATA] */
988 | #define ELFDATA2LSB 1
989 | #define ELFDATA2MSB 2
990 | #define EV_NONE 0 /* e_version, EI_VERSION */
991 | #define EV_CURRENT 1
992 | #define EV_NUM 2
993 | /* Notes used in ET_CORE */
994 | #define NT_PRSTATUS 1
995 | #define NT_PRFPREG 2
996 | #define NT_PRPSINFO 3
997 | #define NT_TASKSTRUCT 4
998 | #define NT_PRXFPREG 0x46e62b7f /* copied from gdb5.1/include/elf/common.h */
999 | /* Note header in a PT_NOTE section */
1000 | typedef struct elf32_note {
1001 | Elf32_Word n_namesz; /* Name size */
1002 | Elf32_Word n_descsz; /* Content size */
1003 | Elf32_Word n_type; /* Content type */
1004 | } Elf32_Nhdr;
1005 | /* Note header in a PT_NOTE section */
1006 | typedef struct elf64_note {
1007 | Elf64_Word n_namesz; /* Name size */
1008 | Elf64_Word n_descsz; /* Content size */
1009 | Elf64_Word n_type; /* Content type */
1010 | } Elf64_Nhdr;
1011 | #if ELF_CLASS == ELFCLASS32
1012 | #define elfhdr elf32_hdr
1013 | #define elf_phdr elf32_phdr
1014 | #define elf_note elf32_note
1015 | #define elf_shdr elf32_shdr
1016 | #define elf_sym elf32_sym
1017 | #define elf_addr_t Elf32_Off
1018 | #ifdef ELF_USES_RELOCA
1019 | # define ELF_RELOC Elf32_Rela
1020 | #else
1021 | # define ELF_RELOC Elf32_Rel
1022 | #endif
1023 | #else
1024 | #define elfhdr elf64_hdr
1025 | #define elf_phdr elf64_phdr
1026 | #define elf_note elf64_note
1027 | #define elf_shdr elf64_shdr
1028 | #define elf_sym elf64_sym
1029 | #define elf_addr_t Elf64_Off
1030 | #ifdef ELF_USES_RELOCA
1031 | # define ELF_RELOC Elf64_Rela
1032 | #else
1033 | # define ELF_RELOC Elf64_Rel
1034 | #endif
1035 | #endif /* ELF_CLASS */
1036 | #ifndef ElfW
1037 | # if ELF_CLASS == ELFCLASS32
1038 | # define ElfW(x) Elf32_ ## x
1039 | # define ELFW(x) ELF32_ ## x
1040 | # else
1041 | # define ElfW(x) Elf64_ ## x
1042 | # define ELFW(x) ELF64_ ## x
1043 | # endif
1044 | #endif
1045 | #endif /* _QEMU_ELF_H */
1046 |
--------------------------------------------------------------------------------
/so/libhello-jni.so:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fourbrother/parse_androidso/2f7b149c0a388023acb5787149dcca8b5ed461ca/so/libhello-jni.so
--------------------------------------------------------------------------------
/so/libhello-jnis.so:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fourbrother/parse_androidso/2f7b149c0a388023acb5787149dcca8b5ed461ca/so/libhello-jnis.so
--------------------------------------------------------------------------------
/src/com/demo/parseso/AddSection.java:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fourbrother/parse_androidso/2f7b149c0a388023acb5787149dcca8b5ed461ca/src/com/demo/parseso/AddSection.java
--------------------------------------------------------------------------------
/src/com/demo/parseso/ElfType32.java:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fourbrother/parse_androidso/2f7b149c0a388023acb5787149dcca8b5ed461ca/src/com/demo/parseso/ElfType32.java
--------------------------------------------------------------------------------
/src/com/demo/parseso/ElfType64.java:
--------------------------------------------------------------------------------
1 | package com.demo.parseso;
2 |
3 | public class ElfType64 {
4 |
5 | public elf64_rel rel;
6 | public elf64_rela rela;
7 | public elf64_sym sym;
8 | public elf64_hdr hdr;
9 | public elf64_phdr phdr;
10 | public elf64_shdr shdr;
11 |
12 | public ElfType64() {
13 | rel = new elf64_rel();
14 | rela = new elf64_rela();
15 | sym = new elf64_sym();
16 | hdr = new elf64_hdr();
17 | phdr = new elf64_phdr();
18 | shdr = new elf64_shdr();
19 | }
20 |
21 |
22 | /**
23 | * typedef struct elf64_rel {
24 | Elf64_Addr r_offset; // Location at which to apply the action
25 | Elf64_Xword r_info; // index and type of relocation
26 | } Elf64_Rel;
27 | */
28 | public class elf64_rel{
29 | public long r_offset;
30 | public long r_info;
31 | }
32 |
33 | /**
34 | * typedef struct elf64_rela {
35 | Elf64_Addr r_offset; // Location at which to apply the action
36 | Elf64_Xword r_info; // index and type of relocation
37 | Elf64_Sxword r_addend; // Constant addend used to compute value
38 | } Elf64_Rela;
39 | */
40 | public class elf64_rela{
41 | public long r_offset;
42 | public long r_info;
43 | public long r_addend;
44 | }
45 |
46 | /**
47 | * typedef struct elf64_sym {
48 | Elf64_Word st_name; // Symbol name, index in string tbl
49 | unsigned char st_info; // Type and binding attributes
50 | unsigned char st_other; // No defined meaning, 0
51 | Elf64_Half st_shndx; // Associated section index
52 | Elf64_Addr st_value; // Value of the symbol
53 | Elf64_Xword st_size; // Associated symbol size
54 | } Elf64_Sym;
55 | */
56 | public class elf64_sym{
57 | public int st_name;
58 | public char st_info;
59 | public char st_other;
60 | public short st_shndx;
61 | public long st_value;
62 | public long st_st_size;
63 | }
64 |
65 | /**
66 | * typedef struct elf64_hdr {
67 | unsigned char e_ident[16]; // ELF "magic number"
68 | Elf64_Half e_type;
69 | Elf64_Half e_machine;
70 | Elf64_Word e_version;
71 | Elf64_Addr e_entry; // Entry point virtual address
72 | Elf64_Off e_phoff; // Program header table file offset
73 | Elf64_Off e_shoff; // Section header table file offset
74 | Elf64_Word e_flags;
75 | Elf64_Half e_ehsize;
76 | Elf64_Half e_phentsize;
77 | Elf64_Half e_phnum;
78 | Elf64_Half e_shentsize;
79 | Elf64_Half e_shnum;
80 | Elf64_Half e_shstrndx;
81 | } Elf64_Ehdr;
82 | */
83 | public class elf64_hdr{
84 | public byte[] e_ident = new byte[16];
85 | public short e_type;
86 | public short e_machine;
87 | public int e_version;
88 | public long e_entry;
89 | public long e_phoff;
90 | public long e_shoff;
91 | public int e_flags;
92 | public short e_ehsize;
93 | public short e_phentsize;
94 | public short e_phnum;
95 | public short e_shentsize;
96 | public short e_shnum;
97 | public short e_shstrndx;
98 | }
99 |
100 | /**
101 | * typedef struct elf64_phdr {
102 | Elf64_Word p_type;
103 | Elf64_Word p_flags;
104 | Elf64_Off p_offset; // Segment file offset
105 | Elf64_Addr p_vaddr; // Segment virtual address
106 | Elf64_Addr p_paddr; // Segment physical address
107 | Elf64_Xword p_filesz; // Segment size in file
108 | Elf64_Xword p_memsz; // Segment size in memory
109 | Elf64_Xword p_align; // Segment alignment, file & memory
110 | } Elf64_Phdr;
111 | */
112 | public class elf64_phdr{
113 | public int p_type;
114 | public int p_flags;
115 | public long p_offset;
116 | public long p_vaddr;
117 | public long p_paddr;
118 | public long p_filesz;
119 | public long p_memsz;
120 | public long p_align;
121 | }
122 |
123 |
124 | /**
125 | * typedef struct elf64_shdr {
126 | Elf64_Word sh_name; // Section name, index in string tbl
127 | Elf64_Word sh_type; // Type of section
128 | Elf64_Xword sh_flags; // Miscellaneous section attributes
129 | Elf64_Addr sh_addr; // Section virtual addr at execution
130 | Elf64_Off sh_offset; // Section file offset
131 | Elf64_Xword sh_size; // Size of section in bytes
132 | Elf64_Word sh_link; // Index of another section
133 | Elf64_Word sh_info; // Additional section information
134 | Elf64_Xword sh_addralign; // Section alignment
135 | Elf64_Xword sh_entsize; // Entry size if section holds table
136 | } Elf64_Shdr;
137 | */
138 | public class elf64_shdr{
139 | public int sh_name;
140 | public int sh_type;
141 | public long sh_flags;
142 | public int sh_addr;
143 | public int sh_offset;
144 | public long sh_size;
145 | public int sh_link;
146 | public int sh_info;
147 | public long sh_addralign;
148 | public long sh_entsize;
149 | }
150 |
151 |
152 | }
153 |
--------------------------------------------------------------------------------
/src/com/demo/parseso/ParseSo.java:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fourbrother/parse_androidso/2f7b149c0a388023acb5787149dcca8b5ed461ca/src/com/demo/parseso/ParseSo.java
--------------------------------------------------------------------------------
/src/com/demo/parseso/Utils.java:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fourbrother/parse_androidso/2f7b149c0a388023acb5787149dcca8b5ed461ca/src/com/demo/parseso/Utils.java
--------------------------------------------------------------------------------
/src/com/demo/parseso/elf.h:
--------------------------------------------------------------------------------
1 | #ifndef _QEMU_ELF_H
2 | #define _QEMU_ELF_H
3 | #include
4 | /* 32-bit ELF base types. */
5 | typedef uint32_t Elf32_Addr;
6 | typedef uint16_t Elf32_Half;
7 | typedef uint32_t Elf32_Off;
8 | typedef int32_t Elf32_Sword;
9 | typedef uint32_t Elf32_Word;
10 | /* 64-bit ELF base types. */
11 | typedef uint64_t Elf64_Addr;
12 | typedef uint16_t Elf64_Half;
13 | typedef int16_t Elf64_SHalf;
14 | typedef uint64_t Elf64_Off;
15 | typedef int32_t Elf64_Sword;
16 | typedef uint32_t Elf64_Word;
17 | typedef uint64_t Elf64_Xword;
18 | typedef int64_t Elf64_Sxword;
19 | /* These constants are for the segment types stored in the image headers */
20 | #define PT_NULL 0
21 | #define PT_LOAD 1
22 | #define PT_DYNAMIC 2
23 | #define PT_INTERP 3
24 | #define PT_NOTE 4
25 | #define PT_SHLIB 5
26 | #define PT_PHDR 6
27 | #define PT_LOPROC 0x70000000
28 | #define PT_HIPROC 0x7fffffff
29 | #define PT_MIPS_REGINFO 0x70000000
30 | #define PT_MIPS_OPTIONS 0x70000001
31 | /* Flags in the e_flags field of the header */
32 | /* MIPS architecture level. */
33 | #define EF_MIPS_ARCH_1 0x00000000 /* -mips1 code. */
34 | #define EF_MIPS_ARCH_2 0x10000000 /* -mips2 code. */
35 | #define EF_MIPS_ARCH_3 0x20000000 /* -mips3 code. */
36 | #define EF_MIPS_ARCH_4 0x30000000 /* -mips4 code. */
37 | #define EF_MIPS_ARCH_5 0x40000000 /* -mips5 code. */
38 | #define EF_MIPS_ARCH_32 0x50000000 /* MIPS32 code. */
39 | #define EF_MIPS_ARCH_64 0x60000000 /* MIPS64 code. */
40 | /* The ABI of a file. */
41 | #define EF_MIPS_ABI_O32 0x00001000 /* O32 ABI. */
42 | #define EF_MIPS_ABI_O64 0x00002000 /* O32 extended for 64 bit. */
43 | #define EF_MIPS_NOREORDER 0x00000001
44 | #define EF_MIPS_PIC 0x00000002
45 | #define EF_MIPS_CPIC 0x00000004
46 | #define EF_MIPS_ABI2 0x00000020
47 | #define EF_MIPS_OPTIONS_FIRST 0x00000080
48 | #define EF_MIPS_32BITMODE 0x00000100
49 | #define EF_MIPS_ABI 0x0000f000
50 | #define EF_MIPS_ARCH 0xf0000000
51 | /* These constants define the different elf file types */
52 | #define ET_NONE 0
53 | #define ET_REL 1
54 | #define ET_EXEC 2
55 | #define ET_DYN 3
56 | #define ET_CORE 4
57 | #define ET_LOPROC 0xff00
58 | #define ET_HIPROC 0xffff
59 | /* These constants define the various ELF target machines */
60 | #define EM_NONE 0
61 | #define EM_M32 1
62 | #define EM_SPARC 2
63 | #define EM_386 3
64 | #define EM_68K 4
65 | #define EM_88K 5
66 | #define EM_486 6 /* Perhaps disused */
67 | #define EM_860 7
68 | #define EM_MIPS 8 /* MIPS R3000 (officially, big-endian only) */
69 | #define EM_MIPS_RS4_BE 10 /* MIPS R4000 big-endian */
70 | #define EM_PARISC 15 /* HPPA */
71 | #define EM_SPARC32PLUS 18 /* Sun's "v8plus" */
72 | #define EM_PPC 20 /* PowerPC */
73 | #define EM_PPC64 21 /* PowerPC64 */
74 | #define EM_ARM 40 /* ARM */
75 | #define EM_SH 42 /* SuperH */
76 | #define EM_SPARCV9 43 /* SPARC v9 64-bit */
77 | #define EM_IA_64 50 /* HP/Intel IA-64 */
78 | #define EM_X86_64 62 /* AMD x86-64 */
79 | #define EM_S390 22 /* IBM S/390 */
80 | #define EM_CRIS 76 /* Axis Communications 32-bit embedded processor */
81 | #define EM_V850 87 /* NEC v850 */
82 | #define EM_H8_300H 47 /* Hitachi H8/300H */
83 | #define EM_H8S 48 /* Hitachi H8S */
84 | /*
85 | * This is an interim value that we will use until the committee comes
86 | * up with a final number.
87 | */
88 | #define EM_ALPHA 0x9026
89 | /* Bogus old v850 magic number, used by old tools. */
90 | #define EM_CYGNUS_V850 0x9080
91 | /*
92 | * This is the old interim value for S/390 architecture
93 | */
94 | #define EM_S390_OLD 0xA390
95 | /* This is the info that is needed to parse the dynamic section of the file */
96 | #define DT_NULL 0
97 | #define DT_NEEDED 1
98 | #define DT_PLTRELSZ 2
99 | #define DT_PLTGOT 3
100 | #define DT_HASH 4
101 | #define DT_STRTAB 5
102 | #define DT_SYMTAB 6
103 | #define DT_RELA 7
104 | #define DT_RELASZ 8
105 | #define DT_RELAENT 9
106 | #define DT_STRSZ 10
107 | #define DT_SYMENT 11
108 | #define DT_INIT 12
109 | #define DT_FINI 13
110 | #define DT_SONAME 14
111 | #define DT_RPATH 15
112 | #define DT_SYMBOLIC 16
113 | #define DT_REL 17
114 | #define DT_RELSZ 18
115 | #define DT_RELENT 19
116 | #define DT_PLTREL 20
117 | #define DT_DEBUG 21
118 | #define DT_TEXTREL 22
119 | #define DT_JMPREL 23
120 | #define DT_LOPROC 0x70000000
121 | #define DT_HIPROC 0x7fffffff
122 | #define DT_MIPS_RLD_VERSION 0x70000001
123 | #define DT_MIPS_TIME_STAMP 0x70000002
124 | #define DT_MIPS_ICHECKSUM 0x70000003
125 | #define DT_MIPS_IVERSION 0x70000004
126 | #define DT_MIPS_FLAGS 0x70000005
127 | #define RHF_NONE 0
128 | #define RHF_HARDWAY 1
129 | #define RHF_NOTPOT 2
130 | #define DT_MIPS_BASE_ADDRESS 0x70000006
131 | #define DT_MIPS_CONFLICT 0x70000008
132 | #define DT_MIPS_LIBLIST 0x70000009
133 | #define DT_MIPS_LOCAL_GOTNO 0x7000000a
134 | #define DT_MIPS_CONFLICTNO 0x7000000b
135 | #define DT_MIPS_LIBLISTNO 0x70000010
136 | #define DT_MIPS_SYMTABNO 0x70000011
137 | #define DT_MIPS_UNREFEXTNO 0x70000012
138 | #define DT_MIPS_GOTSYM 0x70000013
139 | #define DT_MIPS_HIPAGENO 0x70000014
140 | #define DT_MIPS_RLD_MAP 0x70000016
141 | /* This info is needed when parsing the symbol table */
142 | #define STB_LOCAL 0
143 | #define STB_GLOBAL 1
144 | #define STB_WEAK 2
145 | #define STT_NOTYPE 0
146 | #define STT_OBJECT 1
147 | #define STT_FUNC 2
148 | #define STT_SECTION 3
149 | #define STT_FILE 4
150 | #define ELF_ST_BIND(x) ((x) >> 4)
151 | #define ELF_ST_TYPE(x) (((unsigned int) x) & 0xf)
152 | #define ELF32_ST_BIND(x) ELF_ST_BIND(x)
153 | #define ELF32_ST_TYPE(x) ELF_ST_TYPE(x)
154 | #define ELF64_ST_BIND(x) ELF_ST_BIND(x)
155 | #define ELF64_ST_TYPE(x) ELF_ST_TYPE(x)
156 | /* Symbolic values for the entries in the auxiliary table
157 | put on the initial stack */
158 | #define AT_NULL 0 /* end of vector */
159 | #define AT_IGNORE 1 /* entry should be ignored */
160 | #define AT_EXECFD 2 /* file descriptor of program */
161 | #define AT_PHDR 3 /* program headers for program */
162 | #define AT_PHENT 4 /* size of program header entry */
163 | #define AT_PHNUM 5 /* number of program headers */
164 | #define AT_PAGESZ 6 /* system page size */
165 | #define AT_BASE 7 /* base address of interpreter */
166 | #define AT_FLAGS 8 /* flags */
167 | #define AT_ENTRY 9 /* entry point of program */
168 | #define AT_NOTELF 10 /* program is not ELF */
169 | #define AT_UID 11 /* real uid */
170 | #define AT_EUID 12 /* effective uid */
171 | #define AT_GID 13 /* real gid */
172 | #define AT_EGID 14 /* effective gid */
173 | #define AT_PLATFORM 15 /* string identifying CPU for optimizations */
174 | #define AT_HWCAP 16 /* arch dependent hints at CPU capabilities */
175 | #define AT_CLKTCK 17 /* frequency at which times() increments */
176 | typedef struct dynamic{
177 | Elf32_Sword d_tag;
178 | union{
179 | Elf32_Sword d_val;
180 | Elf32_Addr d_ptr;
181 | } d_un;
182 | } Elf32_Dyn;
183 | typedef struct {
184 | Elf64_Sxword d_tag; /* entry tag value */
185 | union {
186 | Elf64_Xword d_val;
187 | Elf64_Addr d_ptr;
188 | } d_un;
189 | } Elf64_Dyn;
190 | /* The following are used with relocations */
191 | #define ELF32_R_SYM(x) ((x) >> 8)
192 | #define ELF32_R_TYPE(x) ((x) & 0xff)
193 | #define ELF64_R_SYM(i) ((i) >> 32)
194 | #define ELF64_R_TYPE(i) ((i) & 0xffffffff)
195 | #define ELF64_R_TYPE_DATA(i) (((ELF64_R_TYPE(i) >> 8) ^ 0x00800000) - 0x00800000)
196 | #define R_386_NONE 0
197 | #define R_386_32 1
198 | #define R_386_PC32 2
199 | #define R_386_GOT32 3
200 | #define R_386_PLT32 4
201 | #define R_386_COPY 5
202 | #define R_386_GLOB_DAT 6
203 | #define R_386_JMP_SLOT 7
204 | #define R_386_RELATIVE 8
205 | #define R_386_GOTOFF 9
206 | #define R_386_GOTPC 10
207 | #define R_386_NUM 11
208 | #define R_MIPS_NONE 0
209 | #define R_MIPS_16 1
210 | #define R_MIPS_32 2
211 | #define R_MIPS_REL32 3
212 | #define R_MIPS_26 4
213 | #define R_MIPS_HI16 5
214 | #define R_MIPS_LO16 6
215 | #define R_MIPS_GPREL16 7
216 | #define R_MIPS_LITERAL 8
217 | #define R_MIPS_GOT16 9
218 | #define R_MIPS_PC16 10
219 | #define R_MIPS_CALL16 11
220 | #define R_MIPS_GPREL32 12
221 | /* The remaining relocs are defined on Irix, although they are not
222 | in the MIPS ELF ABI. */
223 | #define R_MIPS_UNUSED1 13
224 | #define R_MIPS_UNUSED2 14
225 | #define R_MIPS_UNUSED3 15
226 | #define R_MIPS_SHIFT5 16
227 | #define R_MIPS_SHIFT6 17
228 | #define R_MIPS_64 18
229 | #define R_MIPS_GOT_DISP 19
230 | #define R_MIPS_GOT_PAGE 20
231 | #define R_MIPS_GOT_OFST 21
232 | /*
233 | * The following two relocation types are specified in the MIPS ABI
234 | * conformance guide version 1.2 but not yet in the psABI.
235 | */
236 | #define R_MIPS_GOTHI16 22
237 | #define R_MIPS_GOTLO16 23
238 | #define R_MIPS_SUB 24
239 | #define R_MIPS_INSERT_A 25
240 | #define R_MIPS_INSERT_B 26
241 | #define R_MIPS_DELETE 27
242 | #define R_MIPS_HIGHER 28
243 | #define R_MIPS_HIGHEST 29
244 | /*
245 | * The following two relocation types are specified in the MIPS ABI
246 | * conformance guide version 1.2 but not yet in the psABI.
247 | */
248 | #define R_MIPS_CALLHI16 30
249 | #define R_MIPS_CALLLO16 31
250 | /*
251 | * This range is reserved for vendor specific relocations.
252 | */
253 | #define R_MIPS_LOVENDOR 100
254 | #define R_MIPS_HIVENDOR 127
255 | /*
256 | * Sparc ELF relocation types
257 | */
258 | #define R_SPARC_NONE 0
259 | #define R_SPARC_8 1
260 | #define R_SPARC_16 2
261 | #define R_SPARC_32 3
262 | #define R_SPARC_DISP8 4
263 | #define R_SPARC_DISP16 5
264 | #define R_SPARC_DISP32 6
265 | #define R_SPARC_WDISP30 7
266 | #define R_SPARC_WDISP22 8
267 | #define R_SPARC_HI22 9
268 | #define R_SPARC_22 10
269 | #define R_SPARC_13 11
270 | #define R_SPARC_LO10 12
271 | #define R_SPARC_GOT10 13
272 | #define R_SPARC_GOT13 14
273 | #define R_SPARC_GOT22 15
274 | #define R_SPARC_PC10 16
275 | #define R_SPARC_PC22 17
276 | #define R_SPARC_WPLT30 18
277 | #define R_SPARC_COPY 19
278 | #define R_SPARC_GLOB_DAT 20
279 | #define R_SPARC_JMP_SLOT 21
280 | #define R_SPARC_RELATIVE 22
281 | #define R_SPARC_UA32 23
282 | #define R_SPARC_PLT32 24
283 | #define R_SPARC_HIPLT22 25
284 | #define R_SPARC_LOPLT10 26
285 | #define R_SPARC_PCPLT32 27
286 | #define R_SPARC_PCPLT22 28
287 | #define R_SPARC_PCPLT10 29
288 | #define R_SPARC_10 30
289 | #define R_SPARC_11 31
290 | #define R_SPARC_64 32
291 | #define R_SPARC_OLO10 33
292 | #define R_SPARC_HH22 34
293 | #define R_SPARC_HM10 35
294 | #define R_SPARC_LM22 36
295 | #define R_SPARC_WDISP16 40
296 | #define R_SPARC_WDISP19 41
297 | #define R_SPARC_7 43
298 | #define R_SPARC_5 44
299 | #define R_SPARC_6 45
300 | /* Bits present in AT_HWCAP, primarily for Sparc32. */
301 | #define HWCAP_SPARC_FLUSH 1 /* CPU supports flush instruction. */
302 | #define HWCAP_SPARC_STBAR 2
303 | #define HWCAP_SPARC_SWAP 4
304 | #define HWCAP_SPARC_MULDIV 8
305 | #define HWCAP_SPARC_V9 16
306 | #define HWCAP_SPARC_ULTRA3 32
307 | /*
308 | * 68k ELF relocation types
309 | */
310 | #define R_68K_NONE 0
311 | #define R_68K_32 1
312 | #define R_68K_16 2
313 | #define R_68K_8 3
314 | #define R_68K_PC32 4
315 | #define R_68K_PC16 5
316 | #define R_68K_PC8 6
317 | #define R_68K_GOT32 7
318 | #define R_68K_GOT16 8
319 | #define R_68K_GOT8 9
320 | #define R_68K_GOT32O 10
321 | #define R_68K_GOT16O 11
322 | #define R_68K_GOT8O 12
323 | #define R_68K_PLT32 13
324 | #define R_68K_PLT16 14
325 | #define R_68K_PLT8 15
326 | #define R_68K_PLT32O 16
327 | #define R_68K_PLT16O 17
328 | #define R_68K_PLT8O 18
329 | #define R_68K_COPY 19
330 | #define R_68K_GLOB_DAT 20
331 | #define R_68K_JMP_SLOT 21
332 | #define R_68K_RELATIVE 22
333 | /*
334 | * Alpha ELF relocation types
335 | */
336 | #define R_ALPHA_NONE 0 /* No reloc */
337 | #define R_ALPHA_REFLONG 1 /* Direct 32 bit */
338 | #define R_ALPHA_REFQUAD 2 /* Direct 64 bit */
339 | #define R_ALPHA_GPREL32 3 /* GP relative 32 bit */
340 | #define R_ALPHA_LITERAL 4 /* GP relative 16 bit w/optimization */
341 | #define R_ALPHA_LITUSE 5 /* Optimization hint for LITERAL */
342 | #define R_ALPHA_GPDISP 6 /* Add displacement to GP */
343 | #define R_ALPHA_BRADDR 7 /* PC+4 relative 23 bit shifted */
344 | #define R_ALPHA_HINT 8 /* PC+4 relative 16 bit shifted */
345 | #define R_ALPHA_SREL16 9 /* PC relative 16 bit */
346 | #define R_ALPHA_SREL32 10 /* PC relative 32 bit */
347 | #define R_ALPHA_SREL64 11 /* PC relative 64 bit */
348 | #define R_ALPHA_GPRELHIGH 17 /* GP relative 32 bit, high 16 bits */
349 | #define R_ALPHA_GPRELLOW 18 /* GP relative 32 bit, low 16 bits */
350 | #define R_ALPHA_GPREL16 19 /* GP relative 16 bit */
351 | #define R_ALPHA_COPY 24 /* Copy symbol at runtime */
352 | #define R_ALPHA_GLOB_DAT 25 /* Create GOT entry */
353 | #define R_ALPHA_JMP_SLOT 26 /* Create PLT entry */
354 | #define R_ALPHA_RELATIVE 27 /* Adjust by program base */
355 | #define R_ALPHA_BRSGP 28
356 | #define R_ALPHA_TLSGD 29
357 | #define R_ALPHA_TLS_LDM 30
358 | #define R_ALPHA_DTPMOD64 31
359 | #define R_ALPHA_GOTDTPREL 32
360 | #define R_ALPHA_DTPREL64 33
361 | #define R_ALPHA_DTPRELHI 34
362 | #define R_ALPHA_DTPRELLO 35
363 | #define R_ALPHA_DTPREL16 36
364 | #define R_ALPHA_GOTTPREL 37
365 | #define R_ALPHA_TPREL64 38
366 | #define R_ALPHA_TPRELHI 39
367 | #define R_ALPHA_TPRELLO 40
368 | #define R_ALPHA_TPREL16 41
369 | #define SHF_ALPHA_GPREL 0x10000000
370 | /* PowerPC relocations defined by the ABIs */
371 | #define R_PPC_NONE 0
372 | #define R_PPC_ADDR32 1 /* 32bit absolute address */
373 | #define R_PPC_ADDR24 2 /* 26bit address, 2 bits ignored. */
374 | #define R_PPC_ADDR16 3 /* 16bit absolute address */
375 | #define R_PPC_ADDR16_LO 4 /* lower 16bit of absolute address */
376 | #define R_PPC_ADDR16_HI 5 /* high 16bit of absolute address */
377 | #define R_PPC_ADDR16_HA 6 /* adjusted high 16bit */
378 | #define R_PPC_ADDR14 7 /* 16bit address, 2 bits ignored */
379 | #define R_PPC_ADDR14_BRTAKEN 8
380 | #define R_PPC_ADDR14_BRNTAKEN 9
381 | #define R_PPC_REL24 10 /* PC relative 26 bit */
382 | #define R_PPC_REL14 11 /* PC relative 16 bit */
383 | #define R_PPC_REL14_BRTAKEN 12
384 | #define R_PPC_REL14_BRNTAKEN 13
385 | #define R_PPC_GOT16 14
386 | #define R_PPC_GOT16_LO 15
387 | #define R_PPC_GOT16_HI 16
388 | #define R_PPC_GOT16_HA 17
389 | #define R_PPC_PLTREL24 18
390 | #define R_PPC_COPY 19
391 | #define R_PPC_GLOB_DAT 20
392 | #define R_PPC_JMP_SLOT 21
393 | #define R_PPC_RELATIVE 22
394 | #define R_PPC_LOCAL24PC 23
395 | #define R_PPC_UADDR32 24
396 | #define R_PPC_UADDR16 25
397 | #define R_PPC_REL32 26
398 | #define R_PPC_PLT32 27
399 | #define R_PPC_PLTREL32 28
400 | #define R_PPC_PLT16_LO 29
401 | #define R_PPC_PLT16_HI 30
402 | #define R_PPC_PLT16_HA 31
403 | #define R_PPC_SDAREL16 32
404 | #define R_PPC_SECTOFF 33
405 | #define R_PPC_SECTOFF_LO 34
406 | #define R_PPC_SECTOFF_HI 35
407 | #define R_PPC_SECTOFF_HA 36
408 | /* Keep this the last entry. */
409 | #define R_PPC_NUM 37
410 | /* ARM specific declarations */
411 | /* Processor specific flags for the ELF header e_flags field. */
412 | #define EF_ARM_RELEXEC 0x01
413 | #define EF_ARM_HASENTRY 0x02
414 | #define EF_ARM_INTERWORK 0x04
415 | #define EF_ARM_APCS_26 0x08
416 | #define EF_ARM_APCS_FLOAT 0x10
417 | #define EF_ARM_PIC 0x20
418 | #define EF_ALIGN8 0x40 /* 8-bit structure alignment is in use */
419 | #define EF_NEW_ABI 0x80
420 | #define EF_OLD_ABI 0x100
421 | /* Additional symbol types for Thumb */
422 | #define STT_ARM_TFUNC 0xd
423 | /* ARM-specific values for sh_flags */
424 | #define SHF_ARM_ENTRYSECT 0x10000000 /* Section contains an entry point */
425 | #define SHF_ARM_COMDEF 0x80000000 /* Section may be multiply defined
426 | in the input to a link step */
427 | /* ARM-specific program header flags */
428 | #define PF_ARM_SB 0x10000000 /* Segment contains the location
429 | addressed by the static base */
430 | /* ARM relocs. */
431 | #define R_ARM_NONE 0 /* No reloc */
432 | #define R_ARM_PC24 1 /* PC relative 26 bit branch */
433 | #define R_ARM_ABS32 2 /* Direct 32 bit */
434 | #define R_ARM_REL32 3 /* PC relative 32 bit */
435 | #define R_ARM_PC13 4
436 | #define R_ARM_ABS16 5 /* Direct 16 bit */
437 | #define R_ARM_ABS12 6 /* Direct 12 bit */
438 | #define R_ARM_THM_ABS5 7
439 | #define R_ARM_ABS8 8 /* Direct 8 bit */
440 | #define R_ARM_SBREL32 9
441 | #define R_ARM_THM_PC22 10
442 | #define R_ARM_THM_PC8 11
443 | #define R_ARM_AMP_VCALL9 12
444 | #define R_ARM_SWI24 13
445 | #define R_ARM_THM_SWI8 14
446 | #define R_ARM_XPC25 15
447 | #define R_ARM_THM_XPC22 16
448 | #define R_ARM_COPY 20 /* Copy symbol at runtime */
449 | #define R_ARM_GLOB_DAT 21 /* Create GOT entry */
450 | #define R_ARM_JUMP_SLOT 22 /* Create PLT entry */
451 | #define R_ARM_RELATIVE 23 /* Adjust by program base */
452 | #define R_ARM_GOTOFF 24 /* 32 bit offset to GOT */
453 | #define R_ARM_GOTPC 25 /* 32 bit PC relative offset to GOT */
454 | #define R_ARM_GOT32 26 /* 32 bit GOT entry */
455 | #define R_ARM_PLT32 27 /* 32 bit PLT address */
456 | #define R_ARM_CALL 28
457 | #define R_ARM_JUMP24 29
458 | #define R_ARM_GNU_VTENTRY 100
459 | #define R_ARM_GNU_VTINHERIT 101
460 | #define R_ARM_THM_PC11 102 /* thumb unconditional branch */
461 | #define R_ARM_THM_PC9 103 /* thumb conditional branch */
462 | #define R_ARM_RXPC25 249
463 | #define R_ARM_RSBREL32 250
464 | #define R_ARM_THM_RPC22 251
465 | #define R_ARM_RREL32 252
466 | #define R_ARM_RABS22 253
467 | #define R_ARM_RPC24 254
468 | #define R_ARM_RBASE 255
469 | /* Keep this the last entry. */
470 | #define R_ARM_NUM 256
471 | /* s390 relocations defined by the ABIs */
472 | #define R_390_NONE 0 /* No reloc. */
473 | #define R_390_8 1 /* Direct 8 bit. */
474 | #define R_390_12 2 /* Direct 12 bit. */
475 | #define R_390_16 3 /* Direct 16 bit. */
476 | #define R_390_32 4 /* Direct 32 bit. */
477 | #define R_390_PC32 5 /* PC relative 32 bit. */
478 | #define R_390_GOT12 6 /* 12 bit GOT offset. */
479 | #define R_390_GOT32 7 /* 32 bit GOT offset. */
480 | #define R_390_PLT32 8 /* 32 bit PC relative PLT address. */
481 | #define R_390_COPY 9 /* Copy symbol at runtime. */
482 | #define R_390_GLOB_DAT 10 /* Create GOT entry. */
483 | #define R_390_JMP_SLOT 11 /* Create PLT entry. */
484 | #define R_390_RELATIVE 12 /* Adjust by program base. */
485 | #define R_390_GOTOFF32 13 /* 32 bit offset to GOT. */
486 | #define R_390_GOTPC 14 /* 32 bit PC rel. offset to GOT. */
487 | #define R_390_GOT16 15 /* 16 bit GOT offset. */
488 | #define R_390_PC16 16 /* PC relative 16 bit. */
489 | #define R_390_PC16DBL 17 /* PC relative 16 bit shifted by 1. */
490 | #define R_390_PLT16DBL 18 /* 16 bit PC rel. PLT shifted by 1. */
491 | #define R_390_PC32DBL 19 /* PC relative 32 bit shifted by 1. */
492 | #define R_390_PLT32DBL 20 /* 32 bit PC rel. PLT shifted by 1. */
493 | #define R_390_GOTPCDBL 21 /* 32 bit PC rel. GOT shifted by 1. */
494 | #define R_390_64 22 /* Direct 64 bit. */
495 | #define R_390_PC64 23 /* PC relative 64 bit. */
496 | #define R_390_GOT64 24 /* 64 bit GOT offset. */
497 | #define R_390_PLT64 25 /* 64 bit PC relative PLT address. */
498 | #define R_390_GOTENT 26 /* 32 bit PC rel. to GOT entry >> 1. */
499 | #define R_390_GOTOFF16 27 /* 16 bit offset to GOT. */
500 | #define R_390_GOTOFF64 28 /* 64 bit offset to GOT. */
501 | #define R_390_GOTPLT12 29 /* 12 bit offset to jump slot. */
502 | #define R_390_GOTPLT16 30 /* 16 bit offset to jump slot. */
503 | #define R_390_GOTPLT32 31 /* 32 bit offset to jump slot. */
504 | #define R_390_GOTPLT64 32 /* 64 bit offset to jump slot. */
505 | #define R_390_GOTPLTENT 33 /* 32 bit rel. offset to jump slot. */
506 | #define R_390_PLTOFF16 34 /* 16 bit offset from GOT to PLT. */
507 | #define R_390_PLTOFF32 35 /* 32 bit offset from GOT to PLT. */
508 | #define R_390_PLTOFF64 36 /* 16 bit offset from GOT to PLT. */
509 | #define R_390_TLS_LOAD 37 /* Tag for load insn in TLS code. */
510 | #define R_390_TLS_GDCALL 38 /* Tag for function call in general
511 | dynamic TLS code. */
512 | #define R_390_TLS_LDCALL 39 /* Tag for function call in local
513 | dynamic TLS code. */
514 | #define R_390_TLS_GD32 40 /* Direct 32 bit for general dynamic
515 | thread local data. */
516 | #define R_390_TLS_GD64 41 /* Direct 64 bit for general dynamic
517 | thread local data. */
518 | #define R_390_TLS_GOTIE12 42 /* 12 bit GOT offset for static TLS
519 | block offset. */
520 | #define R_390_TLS_GOTIE32 43 /* 32 bit GOT offset for static TLS
521 | block offset. */
522 | #define R_390_TLS_GOTIE64 44 /* 64 bit GOT offset for static TLS
523 | block offset. */
524 | #define R_390_TLS_LDM32 45 /* Direct 32 bit for local dynamic
525 | thread local data in LD code. */
526 | #define R_390_TLS_LDM64 46 /* Direct 64 bit for local dynamic
527 | thread local data in LD code. */
528 | #define R_390_TLS_IE32 47 /* 32 bit address of GOT entry for
529 | negated static TLS block offset. */
530 | #define R_390_TLS_IE64 48 /* 64 bit address of GOT entry for
531 | negated static TLS block offset. */
532 | #define R_390_TLS_IEENT 49 /* 32 bit rel. offset to GOT entry for
533 | negated static TLS block offset. */
534 | #define R_390_TLS_LE32 50 /* 32 bit negated offset relative to
535 | static TLS block. */
536 | #define R_390_TLS_LE64 51 /* 64 bit negated offset relative to
537 | static TLS block. */
538 | #define R_390_TLS_LDO32 52 /* 32 bit offset relative to TLS
539 | block. */
540 | #define R_390_TLS_LDO64 53 /* 64 bit offset relative to TLS
541 | block. */
542 | #define R_390_TLS_DTPMOD 54 /* ID of module containing symbol. */
543 | #define R_390_TLS_DTPOFF 55 /* Offset in TLS block. */
544 | #define R_390_TLS_TPOFF 56 /* Negate offset in static TLS
545 | block. */
546 | /* Keep this the last entry. */
547 | #define R_390_NUM 57
548 | /* x86-64 relocation types */
549 | #define R_X86_64_NONE 0 /* No reloc */
550 | #define R_X86_64_64 1 /* Direct 64 bit */
551 | #define R_X86_64_PC32 2 /* PC relative 32 bit signed */
552 | #define R_X86_64_GOT32 3 /* 32 bit GOT entry */
553 | #define R_X86_64_PLT32 4 /* 32 bit PLT address */
554 | #define R_X86_64_COPY 5 /* Copy symbol at runtime */
555 | #define R_X86_64_GLOB_DAT 6 /* Create GOT entry */
556 | #define R_X86_64_JUMP_SLOT 7 /* Create PLT entry */
557 | #define R_X86_64_RELATIVE 8 /* Adjust by program base */
558 | #define R_X86_64_GOTPCREL 9 /* 32 bit signed pc relative
559 | offset to GOT */
560 | #define R_X86_64_32 10 /* Direct 32 bit zero extended */
561 | #define R_X86_64_32S 11 /* Direct 32 bit sign extended */
562 | #define R_X86_64_16 12 /* Direct 16 bit zero extended */
563 | #define R_X86_64_PC16 13 /* 16 bit sign extended pc relative */
564 | #define R_X86_64_8 14 /* Direct 8 bit sign extended */
565 | #define R_X86_64_PC8 15 /* 8 bit sign extended pc relative */
566 | #define R_X86_64_NUM 16
567 | /* Legal values for e_flags field of Elf64_Ehdr. */
568 | #define EF_ALPHA_32BIT 1 /* All addresses are below 2GB */
569 | /* HPPA specific definitions. */
570 | /* Legal values for e_flags field of Elf32_Ehdr. */
571 | #define EF_PARISC_TRAPNIL 0x00010000 /* Trap nil pointer dereference. */
572 | #define EF_PARISC_EXT 0x00020000 /* Program uses arch. extensions. */
573 | #define EF_PARISC_LSB 0x00040000 /* Program expects little endian. */
574 | #define EF_PARISC_WIDE 0x00080000 /* Program expects wide mode. */
575 | #define EF_PARISC_NO_KABP 0x00100000 /* No kernel assisted branch
576 | prediction. */
577 | #define EF_PARISC_LAZYSWAP 0x00400000 /* Allow lazy swapping. */
578 | #define EF_PARISC_ARCH 0x0000ffff /* Architecture version. */
579 | /* Defined values for `e_flags & EF_PARISC_ARCH' are: */
580 | #define EFA_PARISC_1_0 0x020b /* PA-RISC 1.0 big-endian. */
581 | #define EFA_PARISC_1_1 0x0210 /* PA-RISC 1.1 big-endian. */
582 | #define EFA_PARISC_2_0 0x0214 /* PA-RISC 2.0 big-endian. */
583 | /* Additional section indeces. */
584 | #define SHN_PARISC_ANSI_COMMON 0xff00 /* Section for tenatively declared
585 | symbols in ANSI C. */
586 | #define SHN_PARISC_HUGE_COMMON 0xff01 /* Common blocks in huge model. */
587 | /* Legal values for sh_type field of Elf32_Shdr. */
588 | #define SHT_PARISC_EXT 0x70000000 /* Contains product specific ext. */
589 | #define SHT_PARISC_UNWIND 0x70000001 /* Unwind information. */
590 | #define SHT_PARISC_DOC 0x70000002 /* Debug info for optimized code. */
591 | /* Legal values for sh_flags field of Elf32_Shdr. */
592 | #define SHF_PARISC_SHORT 0x20000000 /* Section with short addressing. */
593 | #define SHF_PARISC_HUGE 0x40000000 /* Section far from gp. */
594 | #define SHF_PARISC_SBP 0x80000000 /* Static branch prediction code. */
595 | /* Legal values for ST_TYPE subfield of st_info (symbol type). */
596 | #define STT_PARISC_MILLICODE 13 /* Millicode function entry point. */
597 | #define STT_HP_OPAQUE (STT_LOOS + 0x1)
598 | #define STT_HP_STUB (STT_LOOS + 0x2)
599 | /* HPPA relocs. */
600 | #define R_PARISC_NONE 0 /* No reloc. */
601 | #define R_PARISC_DIR32 1 /* Direct 32-bit reference. */
602 | #define R_PARISC_DIR21L 2 /* Left 21 bits of eff. address. */
603 | #define R_PARISC_DIR17R 3 /* Right 17 bits of eff. address. */
604 | #define R_PARISC_DIR17F 4 /* 17 bits of eff. address. */
605 | #define R_PARISC_DIR14R 6 /* Right 14 bits of eff. address. */
606 | #define R_PARISC_PCREL32 9 /* 32-bit rel. address. */
607 | #define R_PARISC_PCREL21L 10 /* Left 21 bits of rel. address. */
608 | #define R_PARISC_PCREL17R 11 /* Right 17 bits of rel. address. */
609 | #define R_PARISC_PCREL17F 12 /* 17 bits of rel. address. */
610 | #define R_PARISC_PCREL14R 14 /* Right 14 bits of rel. address. */
611 | #define R_PARISC_DPREL21L 18 /* Left 21 bits of rel. address. */
612 | #define R_PARISC_DPREL14R 22 /* Right 14 bits of rel. address. */
613 | #define R_PARISC_GPREL21L 26 /* GP-relative, left 21 bits. */
614 | #define R_PARISC_GPREL14R 30 /* GP-relative, right 14 bits. */
615 | #define R_PARISC_LTOFF21L 34 /* LT-relative, left 21 bits. */
616 | #define R_PARISC_LTOFF14R 38 /* LT-relative, right 14 bits. */
617 | #define R_PARISC_SECREL32 41 /* 32 bits section rel. address. */
618 | #define R_PARISC_SEGBASE 48 /* No relocation, set segment base. */
619 | #define R_PARISC_SEGREL32 49 /* 32 bits segment rel. address. */
620 | #define R_PARISC_PLTOFF21L 50 /* PLT rel. address, left 21 bits. */
621 | #define R_PARISC_PLTOFF14R 54 /* PLT rel. address, right 14 bits. */
622 | #define R_PARISC_LTOFF_FPTR32 57 /* 32 bits LT-rel. function pointer. */
623 | #define R_PARISC_LTOFF_FPTR21L 58 /* LT-rel. fct ptr, left 21 bits. */
624 | #define R_PARISC_LTOFF_FPTR14R 62 /* LT-rel. fct ptr, right 14 bits. */
625 | #define R_PARISC_FPTR64 64 /* 64 bits function address. */
626 | #define R_PARISC_PLABEL32 65 /* 32 bits function address. */
627 | #define R_PARISC_PCREL64 72 /* 64 bits PC-rel. address. */
628 | #define R_PARISC_PCREL22F 74 /* 22 bits PC-rel. address. */
629 | #define R_PARISC_PCREL14WR 75 /* PC-rel. address, right 14 bits. */
630 | #define R_PARISC_PCREL14DR 76 /* PC rel. address, right 14 bits. */
631 | #define R_PARISC_PCREL16F 77 /* 16 bits PC-rel. address. */
632 | #define R_PARISC_PCREL16WF 78 /* 16 bits PC-rel. address. */
633 | #define R_PARISC_PCREL16DF 79 /* 16 bits PC-rel. address. */
634 | #define R_PARISC_DIR64 80 /* 64 bits of eff. address. */
635 | #define R_PARISC_DIR14WR 83 /* 14 bits of eff. address. */
636 | #define R_PARISC_DIR14DR 84 /* 14 bits of eff. address. */
637 | #define R_PARISC_DIR16F 85 /* 16 bits of eff. address. */
638 | #define R_PARISC_DIR16WF 86 /* 16 bits of eff. address. */
639 | #define R_PARISC_DIR16DF 87 /* 16 bits of eff. address. */
640 | #define R_PARISC_GPREL64 88 /* 64 bits of GP-rel. address. */
641 | #define R_PARISC_GPREL14WR 91 /* GP-rel. address, right 14 bits. */
642 | #define R_PARISC_GPREL14DR 92 /* GP-rel. address, right 14 bits. */
643 | #define R_PARISC_GPREL16F 93 /* 16 bits GP-rel. address. */
644 | #define R_PARISC_GPREL16WF 94 /* 16 bits GP-rel. address. */
645 | #define R_PARISC_GPREL16DF 95 /* 16 bits GP-rel. address. */
646 | #define R_PARISC_LTOFF64 96 /* 64 bits LT-rel. address. */
647 | #define R_PARISC_LTOFF14WR 99 /* LT-rel. address, right 14 bits. */
648 | #define R_PARISC_LTOFF14DR 100 /* LT-rel. address, right 14 bits. */
649 | #define R_PARISC_LTOFF16F 101 /* 16 bits LT-rel. address. */
650 | #define R_PARISC_LTOFF16WF 102 /* 16 bits LT-rel. address. */
651 | #define R_PARISC_LTOFF16DF 103 /* 16 bits LT-rel. address. */
652 | #define R_PARISC_SECREL64 104 /* 64 bits section rel. address. */
653 | #define R_PARISC_SEGREL64 112 /* 64 bits segment rel. address. */
654 | #define R_PARISC_PLTOFF14WR 115 /* PLT-rel. address, right 14 bits. */
655 | #define R_PARISC_PLTOFF14DR 116 /* PLT-rel. address, right 14 bits. */
656 | #define R_PARISC_PLTOFF16F 117 /* 16 bits LT-rel. address. */
657 | #define R_PARISC_PLTOFF16WF 118 /* 16 bits PLT-rel. address. */
658 | #define R_PARISC_PLTOFF16DF 119 /* 16 bits PLT-rel. address. */
659 | #define R_PARISC_LTOFF_FPTR64 120 /* 64 bits LT-rel. function ptr. */
660 | #define R_PARISC_LTOFF_FPTR14WR 123 /* LT-rel. fct. ptr., right 14 bits. */
661 | #define R_PARISC_LTOFF_FPTR14DR 124 /* LT-rel. fct. ptr., right 14 bits. */
662 | #define R_PARISC_LTOFF_FPTR16F 125 /* 16 bits LT-rel. function ptr. */
663 | #define R_PARISC_LTOFF_FPTR16WF 126 /* 16 bits LT-rel. function ptr. */
664 | #define R_PARISC_LTOFF_FPTR16DF 127 /* 16 bits LT-rel. function ptr. */
665 | #define R_PARISC_LORESERVE 128
666 | #define R_PARISC_COPY 128 /* Copy relocation. */
667 | #define R_PARISC_IPLT 129 /* Dynamic reloc, imported PLT */
668 | #define R_PARISC_EPLT 130 /* Dynamic reloc, exported PLT */
669 | #define R_PARISC_TPREL32 153 /* 32 bits TP-rel. address. */
670 | #define R_PARISC_TPREL21L 154 /* TP-rel. address, left 21 bits. */
671 | #define R_PARISC_TPREL14R 158 /* TP-rel. address, right 14 bits. */
672 | #define R_PARISC_LTOFF_TP21L 162 /* LT-TP-rel. address, left 21 bits. */
673 | #define R_PARISC_LTOFF_TP14R 166 /* LT-TP-rel. address, right 14 bits.*/
674 | #define R_PARISC_LTOFF_TP14F 167 /* 14 bits LT-TP-rel. address. */
675 | #define R_PARISC_TPREL64 216 /* 64 bits TP-rel. address. */
676 | #define R_PARISC_TPREL14WR 219 /* TP-rel. address, right 14 bits. */
677 | #define R_PARISC_TPREL14DR 220 /* TP-rel. address, right 14 bits. */
678 | #define R_PARISC_TPREL16F 221 /* 16 bits TP-rel. address. */
679 | #define R_PARISC_TPREL16WF 222 /* 16 bits TP-rel. address. */
680 | #define R_PARISC_TPREL16DF 223 /* 16 bits TP-rel. address. */
681 | #define R_PARISC_LTOFF_TP64 224 /* 64 bits LT-TP-rel. address. */
682 | #define R_PARISC_LTOFF_TP14WR 227 /* LT-TP-rel. address, right 14 bits.*/
683 | #define R_PARISC_LTOFF_TP14DR 228 /* LT-TP-rel. address, right 14 bits.*/
684 | #define R_PARISC_LTOFF_TP16F 229 /* 16 bits LT-TP-rel. address. */
685 | #define R_PARISC_LTOFF_TP16WF 230 /* 16 bits LT-TP-rel. address. */
686 | #define R_PARISC_LTOFF_TP16DF 231 /* 16 bits LT-TP-rel. address. */
687 | #define R_PARISC_HIRESERVE 255
688 | /* Legal values for p_type field of Elf32_Phdr/Elf64_Phdr. */
689 | #define PT_HP_TLS (PT_LOOS + 0x0)
690 | #define PT_HP_CORE_NONE (PT_LOOS + 0x1)
691 | #define PT_HP_CORE_VERSION (PT_LOOS + 0x2)
692 | #define PT_HP_CORE_KERNEL (PT_LOOS + 0x3)
693 | #define PT_HP_CORE_COMM (PT_LOOS + 0x4)
694 | #define PT_HP_CORE_PROC (PT_LOOS + 0x5)
695 | #define PT_HP_CORE_LOADABLE (PT_LOOS + 0x6)
696 | #define PT_HP_CORE_STACK (PT_LOOS + 0x7)
697 | #define PT_HP_CORE_SHM (PT_LOOS + 0x8)
698 | #define PT_HP_CORE_MMF (PT_LOOS + 0x9)
699 | #define PT_HP_PARALLEL (PT_LOOS + 0x10)
700 | #define PT_HP_FASTBIND (PT_LOOS + 0x11)
701 | #define PT_HP_OPT_ANNOT (PT_LOOS + 0x12)
702 | #define PT_HP_HSL_ANNOT (PT_LOOS + 0x13)
703 | #define PT_HP_STACK (PT_LOOS + 0x14)
704 | #define PT_PARISC_ARCHEXT 0x70000000
705 | #define PT_PARISC_UNWIND 0x70000001
706 | /* Legal values for p_flags field of Elf32_Phdr/Elf64_Phdr. */
707 | #define PF_PARISC_SBP 0x08000000
708 | #define PF_HP_PAGE_SIZE 0x00100000
709 | #define PF_HP_FAR_SHARED 0x00200000
710 | #define PF_HP_NEAR_SHARED 0x00400000
711 | #define PF_HP_CODE 0x01000000
712 | #define PF_HP_MODIFY 0x02000000
713 | #define PF_HP_LAZYSWAP 0x04000000
714 | #define PF_HP_SBP 0x08000000
715 | /* IA-64 specific declarations. */
716 | /* Processor specific flags for the Ehdr e_flags field. */
717 | #define EF_IA_64_MASKOS 0x0000000f /* os-specific flags */
718 | #define EF_IA_64_ABI64 0x00000010 /* 64-bit ABI */
719 | #define EF_IA_64_ARCH 0xff000000 /* arch. version mask */
720 | /* Processor specific values for the Phdr p_type field. */
721 | #define PT_IA_64_ARCHEXT (PT_LOPROC + 0) /* arch extension bits */
722 | #define PT_IA_64_UNWIND (PT_LOPROC + 1) /* ia64 unwind bits */
723 | /* Processor specific flags for the Phdr p_flags field. */
724 | #define PF_IA_64_NORECOV 0x80000000 /* spec insns w/o recovery */
725 | /* Processor specific values for the Shdr sh_type field. */
726 | #define SHT_IA_64_EXT (SHT_LOPROC + 0) /* extension bits */
727 | #define SHT_IA_64_UNWIND (SHT_LOPROC + 1) /* unwind bits */
728 | /* Processor specific flags for the Shdr sh_flags field. */
729 | #define SHF_IA_64_SHORT 0x10000000 /* section near gp */
730 | #define SHF_IA_64_NORECOV 0x20000000 /* spec insns w/o recovery */
731 | /* Processor specific values for the Dyn d_tag field. */
732 | #define DT_IA_64_PLT_RESERVE (DT_LOPROC + 0)
733 | #define DT_IA_64_NUM 1
734 | /* IA-64 relocations. */
735 | #define R_IA64_NONE 0x00 /* none */
736 | #define R_IA64_IMM14 0x21 /* symbol + addend, add imm14 */
737 | #define R_IA64_IMM22 0x22 /* symbol + addend, add imm22 */
738 | #define R_IA64_IMM64 0x23 /* symbol + addend, mov imm64 */
739 | #define R_IA64_DIR32MSB 0x24 /* symbol + addend, data4 MSB */
740 | #define R_IA64_DIR32LSB 0x25 /* symbol + addend, data4 LSB */
741 | #define R_IA64_DIR64MSB 0x26 /* symbol + addend, data8 MSB */
742 | #define R_IA64_DIR64LSB 0x27 /* symbol + addend, data8 LSB */
743 | #define R_IA64_GPREL22 0x2a /* @gprel(sym + add), add imm22 */
744 | #define R_IA64_GPREL64I 0x2b /* @gprel(sym + add), mov imm64 */
745 | #define R_IA64_GPREL32MSB 0x2c /* @gprel(sym + add), data4 MSB */
746 | #define R_IA64_GPREL32LSB 0x2d /* @gprel(sym + add), data4 LSB */
747 | #define R_IA64_GPREL64MSB 0x2e /* @gprel(sym + add), data8 MSB */
748 | #define R_IA64_GPREL64LSB 0x2f /* @gprel(sym + add), data8 LSB */
749 | #define R_IA64_LTOFF22 0x32 /* @ltoff(sym + add), add imm22 */
750 | #define R_IA64_LTOFF64I 0x33 /* @ltoff(sym + add), mov imm64 */
751 | #define R_IA64_PLTOFF22 0x3a /* @pltoff(sym + add), add imm22 */
752 | #define R_IA64_PLTOFF64I 0x3b /* @pltoff(sym + add), mov imm64 */
753 | #define R_IA64_PLTOFF64MSB 0x3e /* @pltoff(sym + add), data8 MSB */
754 | #define R_IA64_PLTOFF64LSB 0x3f /* @pltoff(sym + add), data8 LSB */
755 | #define R_IA64_FPTR64I 0x43 /* @fptr(sym + add), mov imm64 */
756 | #define R_IA64_FPTR32MSB 0x44 /* @fptr(sym + add), data4 MSB */
757 | #define R_IA64_FPTR32LSB 0x45 /* @fptr(sym + add), data4 LSB */
758 | #define R_IA64_FPTR64MSB 0x46 /* @fptr(sym + add), data8 MSB */
759 | #define R_IA64_FPTR64LSB 0x47 /* @fptr(sym + add), data8 LSB */
760 | #define R_IA64_PCREL60B 0x48 /* @pcrel(sym + add), brl */
761 | #define R_IA64_PCREL21B 0x49 /* @pcrel(sym + add), ptb, call */
762 | #define R_IA64_PCREL21M 0x4a /* @pcrel(sym + add), chk.s */
763 | #define R_IA64_PCREL21F 0x4b /* @pcrel(sym + add), fchkf */
764 | #define R_IA64_PCREL32MSB 0x4c /* @pcrel(sym + add), data4 MSB */
765 | #define R_IA64_PCREL32LSB 0x4d /* @pcrel(sym + add), data4 LSB */
766 | #define R_IA64_PCREL64MSB 0x4e /* @pcrel(sym + add), data8 MSB */
767 | #define R_IA64_PCREL64LSB 0x4f /* @pcrel(sym + add), data8 LSB */
768 | #define R_IA64_LTOFF_FPTR22 0x52 /* @ltoff(@fptr(s+a)), imm22 */
769 | #define R_IA64_LTOFF_FPTR64I 0x53 /* @ltoff(@fptr(s+a)), imm64 */
770 | #define R_IA64_LTOFF_FPTR32MSB 0x54 /* @ltoff(@fptr(s+a)), data4 MSB */
771 | #define R_IA64_LTOFF_FPTR32LSB 0x55 /* @ltoff(@fptr(s+a)), data4 LSB */
772 | #define R_IA64_LTOFF_FPTR64MSB 0x56 /* @ltoff(@fptr(s+a)), data8 MSB */
773 | #define R_IA64_LTOFF_FPTR64LSB 0x57 /* @ltoff(@fptr(s+a)), data8 LSB */
774 | #define R_IA64_SEGREL32MSB 0x5c /* @segrel(sym + add), data4 MSB */
775 | #define R_IA64_SEGREL32LSB 0x5d /* @segrel(sym + add), data4 LSB */
776 | #define R_IA64_SEGREL64MSB 0x5e /* @segrel(sym + add), data8 MSB */
777 | #define R_IA64_SEGREL64LSB 0x5f /* @segrel(sym + add), data8 LSB */
778 | #define R_IA64_SECREL32MSB 0x64 /* @secrel(sym + add), data4 MSB */
779 | #define R_IA64_SECREL32LSB 0x65 /* @secrel(sym + add), data4 LSB */
780 | #define R_IA64_SECREL64MSB 0x66 /* @secrel(sym + add), data8 MSB */
781 | #define R_IA64_SECREL64LSB 0x67 /* @secrel(sym + add), data8 LSB */
782 | #define R_IA64_REL32MSB 0x6c /* data 4 + REL */
783 | #define R_IA64_REL32LSB 0x6d /* data 4 + REL */
784 | #define R_IA64_REL64MSB 0x6e /* data 8 + REL */
785 | #define R_IA64_REL64LSB 0x6f /* data 8 + REL */
786 | #define R_IA64_LTV32MSB 0x74 /* symbol + addend, data4 MSB */
787 | #define R_IA64_LTV32LSB 0x75 /* symbol + addend, data4 LSB */
788 | #define R_IA64_LTV64MSB 0x76 /* symbol + addend, data8 MSB */
789 | #define R_IA64_LTV64LSB 0x77 /* symbol + addend, data8 LSB */
790 | #define R_IA64_PCREL21BI 0x79 /* @pcrel(sym + add), 21bit inst */
791 | #define R_IA64_PCREL22 0x7a /* @pcrel(sym + add), 22bit inst */
792 | #define R_IA64_PCREL64I 0x7b /* @pcrel(sym + add), 64bit inst */
793 | #define R_IA64_IPLTMSB 0x80 /* dynamic reloc, imported PLT, MSB */
794 | #define R_IA64_IPLTLSB 0x81 /* dynamic reloc, imported PLT, LSB */
795 | #define R_IA64_COPY 0x84 /* copy relocation */
796 | #define R_IA64_SUB 0x85 /* Addend and symbol difference */
797 | #define R_IA64_LTOFF22X 0x86 /* LTOFF22, relaxable. */
798 | #define R_IA64_LDXMOV 0x87 /* Use of LTOFF22X. */
799 | #define R_IA64_TPREL14 0x91 /* @tprel(sym + add), imm14 */
800 | #define R_IA64_TPREL22 0x92 /* @tprel(sym + add), imm22 */
801 | #define R_IA64_TPREL64I 0x93 /* @tprel(sym + add), imm64 */
802 | #define R_IA64_TPREL64MSB 0x96 /* @tprel(sym + add), data8 MSB */
803 | #define R_IA64_TPREL64LSB 0x97 /* @tprel(sym + add), data8 LSB */
804 | #define R_IA64_LTOFF_TPREL22 0x9a /* @ltoff(@tprel(s+a)), imm2 */
805 | #define R_IA64_DTPMOD64MSB 0xa6 /* @dtpmod(sym + add), data8 MSB */
806 | #define R_IA64_DTPMOD64LSB 0xa7 /* @dtpmod(sym + add), data8 LSB */
807 | #define R_IA64_LTOFF_DTPMOD22 0xaa /* @ltoff(@dtpmod(sym + add)), imm22 */
808 | #define R_IA64_DTPREL14 0xb1 /* @dtprel(sym + add), imm14 */
809 | #define R_IA64_DTPREL22 0xb2 /* @dtprel(sym + add), imm22 */
810 | #define R_IA64_DTPREL64I 0xb3 /* @dtprel(sym + add), imm64 */
811 | #define R_IA64_DTPREL32MSB 0xb4 /* @dtprel(sym + add), data4 MSB */
812 | #define R_IA64_DTPREL32LSB 0xb5 /* @dtprel(sym + add), data4 LSB */
813 | #define R_IA64_DTPREL64MSB 0xb6 /* @dtprel(sym + add), data8 MSB */
814 | #define R_IA64_DTPREL64LSB 0xb7 /* @dtprel(sym + add), data8 LSB */
815 | #define R_IA64_LTOFF_DTPREL22 0xba /* @ltoff(@dtprel(s+a)), imm22 */
816 | typedef struct elf32_rel {
817 | Elf32_Addr r_offset;
818 | Elf32_Word r_info;
819 | } Elf32_Rel;
820 | typedef struct elf64_rel {
821 | Elf64_Addr r_offset; /* Location at which to apply the action */
822 | Elf64_Xword r_info; /* index and type of relocation */
823 | } Elf64_Rel;
824 | typedef struct elf32_rela{
825 | Elf32_Addr r_offset;
826 | Elf32_Word r_info;
827 | Elf32_Sword r_addend;
828 | } Elf32_Rela;
829 | typedef struct elf64_rela {
830 | Elf64_Addr r_offset; /* Location at which to apply the action */
831 | Elf64_Xword r_info; /* index and type of relocation */
832 | Elf64_Sxword r_addend; /* Constant addend used to compute value */
833 | } Elf64_Rela;
834 | typedef struct elf32_sym{
835 | Elf32_Word st_name;
836 | Elf32_Addr st_value;
837 | Elf32_Word st_size;
838 | unsigned char st_info;
839 | unsigned char st_other;
840 | Elf32_Half st_shndx;
841 | } Elf32_Sym;
842 | typedef struct elf64_sym {
843 | Elf64_Word st_name; /* Symbol name, index in string tbl */
844 | unsigned char st_info; /* Type and binding attributes */
845 | unsigned char st_other; /* No defined meaning, 0 */
846 | Elf64_Half st_shndx; /* Associated section index */
847 | Elf64_Addr st_value; /* Value of the symbol */
848 | Elf64_Xword st_size; /* Associated symbol size */
849 | } Elf64_Sym;
850 | #define EI_NIDENT 16
851 | typedef struct elf32_hdr{
852 | unsigned char e_ident[EI_NIDENT];
853 | Elf32_Half e_type;
854 | Elf32_Half e_machine;
855 | Elf32_Word e_version;
856 | Elf32_Addr e_entry; /* Entry point */
857 | Elf32_Off e_phoff;
858 | Elf32_Off e_shoff;
859 | Elf32_Word e_flags;
860 | Elf32_Half e_ehsize;
861 | Elf32_Half e_phentsize;
862 | Elf32_Half e_phnum;
863 | Elf32_Half e_shentsize;
864 | Elf32_Half e_shnum;
865 | Elf32_Half e_shstrndx;
866 | } Elf32_Ehdr;
867 | typedef struct elf64_hdr {
868 | unsigned char e_ident[16]; /* ELF "magic number" */
869 | Elf64_Half e_type;
870 | Elf64_Half e_machine;
871 | Elf64_Word e_version;
872 | Elf64_Addr e_entry; /* Entry point virtual address */
873 | Elf64_Off e_phoff; /* Program header table file offset */
874 | Elf64_Off e_shoff; /* Section header table file offset */
875 | Elf64_Word e_flags;
876 | Elf64_Half e_ehsize;
877 | Elf64_Half e_phentsize;
878 | Elf64_Half e_phnum;
879 | Elf64_Half e_shentsize;
880 | Elf64_Half e_shnum;
881 | Elf64_Half e_shstrndx;
882 | } Elf64_Ehdr;
883 | /* These constants define the permissions on sections in the program
884 | header, p_flags. */
885 | #define PF_R 0x4
886 | #define PF_W 0x2
887 | #define PF_X 0x1
888 | typedef struct elf32_phdr{
889 | Elf32_Word p_type;
890 | Elf32_Off p_offset;
891 | Elf32_Addr p_vaddr;
892 | Elf32_Addr p_paddr;
893 | Elf32_Word p_filesz;
894 | Elf32_Word p_memsz;
895 | Elf32_Word p_flags;
896 | Elf32_Word p_align;
897 | } Elf32_Phdr;
898 | typedef struct elf64_phdr {
899 | Elf64_Word p_type;
900 | Elf64_Word p_flags;
901 | Elf64_Off p_offset; /* Segment file offset */
902 | Elf64_Addr p_vaddr; /* Segment virtual address */
903 | Elf64_Addr p_paddr; /* Segment physical address */
904 | Elf64_Xword p_filesz; /* Segment size in file */
905 | Elf64_Xword p_memsz; /* Segment size in memory */
906 | Elf64_Xword p_align; /* Segment alignment, file & memory */
907 | } Elf64_Phdr;
908 | /* sh_type */
909 | #define SHT_NULL 0
910 | #define SHT_PROGBITS 1
911 | #define SHT_SYMTAB 2
912 | #define SHT_STRTAB 3
913 | #define SHT_RELA 4
914 | #define SHT_HASH 5
915 | #define SHT_DYNAMIC 6
916 | #define SHT_NOTE 7
917 | #define SHT_NOBITS 8
918 | #define SHT_REL 9
919 | #define SHT_SHLIB 10
920 | #define SHT_DYNSYM 11
921 | #define SHT_NUM 12
922 | #define SHT_LOPROC 0x70000000
923 | #define SHT_HIPROC 0x7fffffff
924 | #define SHT_LOUSER 0x80000000
925 | #define SHT_HIUSER 0xffffffff
926 | #define SHT_MIPS_LIST 0x70000000
927 | #define SHT_MIPS_CONFLICT 0x70000002
928 | #define SHT_MIPS_GPTAB 0x70000003
929 | #define SHT_MIPS_UCODE 0x70000004
930 | /* sh_flags */
931 | #define SHF_WRITE 0x1
932 | #define SHF_ALLOC 0x2
933 | #define SHF_EXECINSTR 0x4
934 | #define SHF_MASKPROC 0xf0000000
935 | #define SHF_MIPS_GPREL 0x10000000
936 | /* special section indexes */
937 | #define SHN_UNDEF 0
938 | #define SHN_LORESERVE 0xff00
939 | #define SHN_LOPROC 0xff00
940 | #define SHN_HIPROC 0xff1f
941 | #define SHN_ABS 0xfff1
942 | #define SHN_COMMON 0xfff2
943 | #define SHN_HIRESERVE 0xffff
944 | #define SHN_MIPS_ACCOMON 0xff00
945 | typedef struct elf32_shdr {
946 | Elf32_Word sh_name;
947 | Elf32_Word sh_type;
948 | Elf32_Word sh_flags;
949 | Elf32_Addr sh_addr;
950 | Elf32_Off sh_offset;
951 | Elf32_Word sh_size;
952 | Elf32_Word sh_link;
953 | Elf32_Word sh_info;
954 | Elf32_Word sh_addralign;
955 | Elf32_Word sh_entsize;
956 | } Elf32_Shdr;
957 | typedef struct elf64_shdr {
958 | Elf64_Word sh_name; /* Section name, index in string tbl */
959 | Elf64_Word sh_type; /* Type of section */
960 | Elf64_Xword sh_flags; /* Miscellaneous section attributes */
961 | Elf64_Addr sh_addr; /* Section virtual addr at execution */
962 | Elf64_Off sh_offset; /* Section file offset */
963 | Elf64_Xword sh_size; /* Size of section in bytes */
964 | Elf64_Word sh_link; /* Index of another section */
965 | Elf64_Word sh_info; /* Additional section information */
966 | Elf64_Xword sh_addralign; /* Section alignment */
967 | Elf64_Xword sh_entsize; /* Entry size if section holds table */
968 | } Elf64_Shdr;
969 | #define EI_MAG0 0 /* e_ident[] indexes */
970 | #define EI_MAG1 1
971 | #define EI_MAG2 2
972 | #define EI_MAG3 3
973 | #define EI_CLASS 4
974 | #define EI_DATA 5
975 | #define EI_VERSION 6
976 | #define EI_PAD 7
977 | #define ELFMAG0 0x7f /* EI_MAG */
978 | #define ELFMAG1 'E'
979 | #define ELFMAG2 'L'
980 | #define ELFMAG3 'F'
981 | #define ELFMAG "177ELF"
982 | #define SELFMAG 4
983 | #define ELFCLASSNONE 0 /* EI_CLASS */
984 | #define ELFCLASS32 1
985 | #define ELFCLASS64 2
986 | #define ELFCLASSNUM 3
987 | #define ELFDATANONE 0 /* e_ident[EI_DATA] */
988 | #define ELFDATA2LSB 1
989 | #define ELFDATA2MSB 2
990 | #define EV_NONE 0 /* e_version, EI_VERSION */
991 | #define EV_CURRENT 1
992 | #define EV_NUM 2
993 | /* Notes used in ET_CORE */
994 | #define NT_PRSTATUS 1
995 | #define NT_PRFPREG 2
996 | #define NT_PRPSINFO 3
997 | #define NT_TASKSTRUCT 4
998 | #define NT_PRXFPREG 0x46e62b7f /* copied from gdb5.1/include/elf/common.h */
999 | /* Note header in a PT_NOTE section */
1000 | typedef struct elf32_note {
1001 | Elf32_Word n_namesz; /* Name size */
1002 | Elf32_Word n_descsz; /* Content size */
1003 | Elf32_Word n_type; /* Content type */
1004 | } Elf32_Nhdr;
1005 | /* Note header in a PT_NOTE section */
1006 | typedef struct elf64_note {
1007 | Elf64_Word n_namesz; /* Name size */
1008 | Elf64_Word n_descsz; /* Content size */
1009 | Elf64_Word n_type; /* Content type */
1010 | } Elf64_Nhdr;
1011 | #if ELF_CLASS == ELFCLASS32
1012 | #define elfhdr elf32_hdr
1013 | #define elf_phdr elf32_phdr
1014 | #define elf_note elf32_note
1015 | #define elf_shdr elf32_shdr
1016 | #define elf_sym elf32_sym
1017 | #define elf_addr_t Elf32_Off
1018 | #ifdef ELF_USES_RELOCA
1019 | # define ELF_RELOC Elf32_Rela
1020 | #else
1021 | # define ELF_RELOC Elf32_Rel
1022 | #endif
1023 | #else
1024 | #define elfhdr elf64_hdr
1025 | #define elf_phdr elf64_phdr
1026 | #define elf_note elf64_note
1027 | #define elf_shdr elf64_shdr
1028 | #define elf_sym elf64_sym
1029 | #define elf_addr_t Elf64_Off
1030 | #ifdef ELF_USES_RELOCA
1031 | # define ELF_RELOC Elf64_Rela
1032 | #else
1033 | # define ELF_RELOC Elf64_Rel
1034 | #endif
1035 | #endif /* ELF_CLASS */
1036 | #ifndef ElfW
1037 | # if ELF_CLASS == ELFCLASS32
1038 | # define ElfW(x) Elf32_ ## x
1039 | # define ELFW(x) ELF32_ ## x
1040 | # else
1041 | # define ElfW(x) Elf64_ ## x
1042 | # define ELFW(x) ELF64_ ## x
1043 | # endif
1044 | #endif
1045 | #endif /* _QEMU_ELF_H */
1046 |
--------------------------------------------------------------------------------