1 /* |
|
2 * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. |
|
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
|
4 * |
|
5 * This code is free software; you can redistribute it and/or modify it |
|
6 * under the terms of the GNU General Public License version 2 only, as |
|
7 * published by the Free Software Foundation. |
|
8 * |
|
9 * This code is distributed in the hope that it will be useful, but WITHOUT |
|
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
|
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
|
12 * version 2 for more details (a copy is included in the LICENSE file that |
|
13 * accompanied this code). |
|
14 * |
|
15 * You should have received a copy of the GNU General Public License version |
|
16 * 2 along with this work; if not, write to the Free Software Foundation, |
|
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
|
18 * |
|
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
|
20 * or visit www.oracle.com if you need additional information or have any |
|
21 * questions. |
|
22 */ |
|
23 |
|
24 package jdk.tools.jaotc.jnilibelf; |
|
25 |
|
26 public class JNILibELFAPI { |
|
27 |
|
28 static { |
|
29 System.loadLibrary("jelfshim"); |
|
30 } |
|
31 |
|
32 /** |
|
33 * Definitions for file open. |
|
34 */ |
|
35 public static enum OpenFlags { |
|
36 O_RDONLY(0x0), |
|
37 O_WRONLY(0x1), |
|
38 O_RDWR(0x2), |
|
39 O_CREAT(0x40); |
|
40 |
|
41 private final int intVal; |
|
42 |
|
43 private OpenFlags(int v) { |
|
44 intVal = v; |
|
45 } |
|
46 |
|
47 public int intValue() { |
|
48 return intVal; |
|
49 } |
|
50 } |
|
51 |
|
52 /** |
|
53 * Definitions reflecting those in elf.h. |
|
54 * |
|
55 */ |
|
56 public interface ELF { |
|
57 int EI_NIDENT = 16; |
|
58 |
|
59 int EI_CLASS = 4; /* File class byte index */ |
|
60 int ELFCLASSNONE = 0; /* Invalid class */ |
|
61 int ELFCLASS32 = 1; /* 32-bit objects */ |
|
62 int ELFCLASS64 = 2; /* 64-bit objects */ |
|
63 int ELFCLASSNUM = 3; |
|
64 |
|
65 int EI_DATA = 5; /* Data encoding byte index */ |
|
66 int ELFDATANONE = 0; /* Invalid data encoding */ |
|
67 int ELFDATA2LSB = 1; /* 2's complement, little endian */ |
|
68 int ELFDATA2MSB = 2; /* 2's complement, big endian */ |
|
69 int ELFDATANUM = 3; |
|
70 |
|
71 // Legal architecture values for e_machine (add others as needed) |
|
72 int EM_NONE = 0; /* No machine */ |
|
73 int EM_SPARC = 2; /* SUN SPARC */ |
|
74 int EM_386 = 3; /* Intel 80386 */ |
|
75 int EM_SPARCV9 = 43; /* SPARC v9 64-bit */ |
|
76 int EM_X64_64 = 62; /* AMD x86-64 architecture */ |
|
77 |
|
78 /* Legal values for e_type (object file type). */ |
|
79 |
|
80 int ET_NONE = 0; /* No file type */ |
|
81 int ET_REL = 1; /* Relocatable file */ |
|
82 int ET_EXEC = 2; /* Executable file */ |
|
83 int ET_DYN = 3; /* Shared object file */ |
|
84 int ET_CORE = 4; /* Core file */ |
|
85 int ET_NUM = 5; /* Number of defined types */ |
|
86 int ET_LOOS = 0xfe00; /* OS-specific range start */ |
|
87 int ET_HIOS = 0xfeff; /* OS-specific range end */ |
|
88 int ET_LOPROC = 0xff00; /* Processor-specific range start */ |
|
89 int ET_HIPROC = 0xffff; /* Processor-specific range end */ |
|
90 |
|
91 /* Legal values for e_version (version). */ |
|
92 |
|
93 int EV_NONE = 0; /* Invalid ELF version */ |
|
94 int EV_CURRENT = 1; /* Current version */ |
|
95 int EV_NUM = 2; |
|
96 |
|
97 /* Legal values for p_type (segment type). */ |
|
98 |
|
99 int PT_NULL = 0; /* Program header table entry unused */ |
|
100 int PT_LOAD = 1; /* Loadable program segment */ |
|
101 int PT_DYNAMIC = 2; /* Dynamic linking information */ |
|
102 int PT_INTERP = 3; /* Program interpreter */ |
|
103 int PT_NOTE = 4; /* Auxiliary information */ |
|
104 int PT_SHLIB = 5; /* Reserved */ |
|
105 int PT_PHDR = 6; /* Entry for header table itself */ |
|
106 int PT_TLS = 7; /* Thread-local storage segment */ |
|
107 int PT_NUM = 8; /* Number of defined types */ |
|
108 int PT_LOOS = 0x60000000; /* Start of OS-specific */ |
|
109 int PT_GNU_EH_FRAME = 0x6474e550; /* GCC .eh_frame_hdr segment */ |
|
110 int PT_GNU_STACK = 0x6474e551; /* Indicates stack executability */ |
|
111 int PT_GNU_RELRO = 0x6474e552; /* Read-only after relocation */ |
|
112 int PT_LOSUNW = 0x6ffffffa; |
|
113 int PT_SUNWBSS = 0x6ffffffa; /* Sun Specific segment */ |
|
114 int PT_SUNWSTACK = 0x6ffffffb; /* Stack segment */ |
|
115 int PT_HISUNW = 0x6fffffff; |
|
116 int PT_HIOS = 0x6fffffff; /* End of OS-specific */ |
|
117 int PT_LOPROC = 0x70000000; /* Start of processor-specific */ |
|
118 int PT_HIPROC = 0x7fffffff; /* End of processor-specific */ |
|
119 |
|
120 /* Special section indices. */ |
|
121 |
|
122 int SHN_UNDEF = 0; /* Undefined section */ |
|
123 int SHN_LORESERVE = 0xff00; /* Start of reserved indices */ |
|
124 int SHN_LOPROC = 0xff00; /* Start of processor-specific */ |
|
125 int SHN_BEFORE = 0xff00; /* Order section before all others (Solaris). */ |
|
126 int SHN_AFTER = 0xff01; /* Order section after all others (Solaris). */ |
|
127 int SHN_HIPROC = 0xff1f; /* End of processor-specific */ |
|
128 int SHN_LOOS = 0xff20; /* Start of OS-specific */ |
|
129 int SHN_HIOS = 0xff3f; /* End of OS-specific */ |
|
130 int SHN_ABS = 0xfff1; /* Associated symbol is absolute */ |
|
131 int SHN_COMMON = 0xfff2; /* Associated symbol is common */ |
|
132 int SHN_XINDEX = 0xffff; /* Index is in extra table. */ |
|
133 int SHN_HIRESERVE = 0xffff; /* End of reserved indices */ |
|
134 |
|
135 /* Legal values for sh_type (section type). */ |
|
136 |
|
137 int SHT_NULL = 0; /* Section header table entry unused */ |
|
138 int SHT_PROGBITS = 1; /* Program data */ |
|
139 int SHT_SYMTAB = 2; /* Symbol table */ |
|
140 int SHT_STRTAB = 3; /* String table */ |
|
141 int SHT_RELA = 4; /* Relocation entries with addends */ |
|
142 int SHT_HASH = 5; /* Symbol hash table */ |
|
143 int SHT_DYNAMIC = 6; /* Dynamic linking information */ |
|
144 int SHT_NOTE = 7; /* Notes */ |
|
145 int SHT_NOBITS = 8; /* Program space with no data (bss) */ |
|
146 int SHT_REL = 9; /* Relocation entries, no addends */ |
|
147 int SHT_SHLIB = 10; /* Reserved */ |
|
148 int SHT_DYNSYM = 11; /* Dynamic linker symbol table */ |
|
149 int SHT_INIT_ARRAY = 14; /* Array of constructors */ |
|
150 int SHT_FINI_ARRAY = 15; /* Array of destructors */ |
|
151 int SHT_PREINIT_ARRAY = 16; /* Array of pre-constructors */ |
|
152 int SHT_GROUP = 17; /* Section group */ |
|
153 int SHT_SYMTAB_SHNDX = 18; /* Extended section indeces */ |
|
154 int SHT_NUM = 19; /* Number of defined types. */ |
|
155 int SHT_LOOS = 0x60000000; /* Start OS-specific. */ |
|
156 int SHT_GNU_ATTRIBUTES = 0x6ffffff5; /* Object attributes. */ |
|
157 int SHT_GNU_HASH = 0x6ffffff6; /* GNU-style hash table. */ |
|
158 int SHT_GNU_LIBLIST = 0x6ffffff7; /* Prelink library list */ |
|
159 int SHT_CHECKSUM = 0x6ffffff8; /* Checksum for DSO content. */ |
|
160 int SHT_LOSUNW = 0x6ffffffa; /* Sun-specific low bound. */ |
|
161 int SHT_SUNW_move = 0x6ffffffa; |
|
162 int SHT_SUNW_COMDAT = 0x6ffffffb; |
|
163 int SHT_SUNW_syminfo = 0x6ffffffc; |
|
164 int SHT_GNU_verdef = 0x6ffffffd; /* Version definition section. */ |
|
165 int SHT_GNU_verneed = 0x6ffffffe; /* Version needs section. */ |
|
166 int SHT_GNU_versym = 0x6fffffff; /* Version symbol table. */ |
|
167 int SHT_HISUNW = 0x6fffffff; /* Sun-specific high bound. */ |
|
168 int SHT_HIOS = 0x6fffffff; /* End OS-specific type */ |
|
169 int SHT_LOPROC = 0x70000000; /* Start of processor-specific */ |
|
170 int SHT_HIPROC = 0x7fffffff; /* End of processor-specific */ |
|
171 int SHT_LOUSER = 0x80000000; /* Start of application-specific */ |
|
172 int SHT_HIUSER = 0x8fffffff; /* End of application-specific */ |
|
173 |
|
174 /* Legal values for sh_flags (section flags). */ |
|
175 |
|
176 int SHF_WRITE = (1 << 0); /* Writable */ |
|
177 int SHF_ALLOC = (1 << 1); /* Occupies memory during execution */ |
|
178 int SHF_EXECINSTR = (1 << 2); /* Executable */ |
|
179 int SHF_MERGE = (1 << 4); /* Might be merged */ |
|
180 int SHF_STRINGS = (1 << 5); /* Contains nul-terminated strings */ |
|
181 int SHF_INFO_LINK = (1 << 6); /* `sh_info' contains SHT index */ |
|
182 int SHF_LINK_ORDER = (1 << 7); /* Preserve order after combining */ |
|
183 int SHF_OS_NONCONFORMING = (1 << 8); /* Non-standard OS specific handling required */ |
|
184 int SHF_GROUP = (1 << 9); /* Section is member of a group. */ |
|
185 int SHF_TLS = (1 << 10); /* Section hold thread-local data. */ |
|
186 int SHF_MASKOS = 0x0ff00000; /* OS-specific. */ |
|
187 int SHF_MASKPROC = 0xf0000000; /* Processor-specific */ |
|
188 int SHF_ORDERED = (1 << 30); /* Special ordering requirement (Solaris). */ |
|
189 int SHF_EXCLUDE = (1 << 31); /* |
|
190 * Section is excluded unless referenced or allocated |
|
191 * (Solaris). |
|
192 */ |
|
193 |
|
194 /* Legal values for ST_BIND subfield of st_info (symbol binding). */ |
|
195 |
|
196 int STB_LOCAL = 0; /* Local symbol */ |
|
197 int STB_GLOBAL = 1; /* Global symbol */ |
|
198 int STB_WEAK = 2; /* Weak symbol */ |
|
199 int STB_NUM = 3; /* Number of defined types. */ |
|
200 int STB_LOOS = 10; /* Start of OS-specific */ |
|
201 int STB_GNU_UNIQUE = 10; /* Unique symbol. */ |
|
202 int STB_HIOS = 12; /* End of OS-specific */ |
|
203 int STB_LOPROC = 13; /* Start of processor-specific */ |
|
204 int STB_HIPROC = 15; /* End of processor-specific */ |
|
205 |
|
206 /* Legal values for ST_TYPE subfield of st_info (symbol type). */ |
|
207 |
|
208 int STT_NOTYPE = 0; /* Symbol type is unspecified */ |
|
209 int STT_OBJECT = 1; /* Symbol is a data object */ |
|
210 int STT_FUNC = 2; /* Symbol is a code object */ |
|
211 int STT_SECTION = 3; /* Symbol associated with a section */ |
|
212 int STT_FILE = 4; /* Symbol's name is file name */ |
|
213 int STT_COMMON = 5; /* Symbol is a common data object */ |
|
214 int STT_TLS = 6; /* Symbol is thread-local data object */ |
|
215 int STT_NUM = 7; /* Number of defined types. */ |
|
216 int STT_LOOS = 10; /* Start of OS-specific */ |
|
217 int STT_GNU_IFUNC = 10; /* Symbol is indirect code object */ |
|
218 int STT_HIOS = 12; /* End of OS-specific */ |
|
219 int STT_LOPROC = 13; /* Start of processor-specific */ |
|
220 int STT_HIPROC = 15; /* End of processor-specific */ |
|
221 } |
|
222 |
|
223 /** |
|
224 * Definitions reflecting those in libelf.h. |
|
225 * |
|
226 */ |
|
227 public interface LibELF { |
|
228 |
|
229 public static enum Elf_Cmd { |
|
230 ELF_C_NULL("NULL"), /* Nothing, terminate, or compute only. */ |
|
231 ELF_C_READ("READ"), /* Read .. */ |
|
232 ELF_C_RDWR("RDWR"), /* Read and write .. */ |
|
233 ELF_C_WRITE("WRITE"), /* Write .. */ |
|
234 ELF_C_CLR("CLR"), /* Clear flag. */ |
|
235 ELF_C_SET("SET"), /* Set flag. */ |
|
236 ELF_C_FDDONE("FDDONE"), /* |
|
237 * Signal that file descriptor will not be used anymore. |
|
238 */ |
|
239 ELF_C_FDREAD("FDREAD"), /* |
|
240 * Read rest of data so that file descriptor is not used |
|
241 * anymore. |
|
242 */ |
|
243 /* The following are Linux-only extensions. */ |
|
244 ELF_C_READ_MMAP("READ_MMAP"), /* Read, but mmap the file if possible. */ |
|
245 ELF_C_RDWR_MMAP("RDWR_MMAP"), /* Read and write, with mmap. */ |
|
246 ELF_C_WRITE_MMAP("WRITE_MMAP"), /* Write, with mmap. */ |
|
247 ELF_C_READ_MMAP_PRIVATE("READ_MMAP_PRIVATE"), /* |
|
248 * Read, but memory is writable, results |
|
249 * are not written to the file. |
|
250 */ |
|
251 ELF_C_EMPTY("EMPTY"), /* Copy basic file data but not the content. */ |
|
252 /* The following are SunOS-only enums */ |
|
253 ELF_C_WRIMAGE("WRIMAGE"), |
|
254 ELF_C_IMAGE("IMAGE"), |
|
255 /* Common last entry. */ |
|
256 ELF_C_NUM("NUM"); |
|
257 private final int intVal; |
|
258 private final String name; |
|
259 |
|
260 private Elf_Cmd(String cmd) { |
|
261 name = "ELF_C_" + cmd; |
|
262 switch (cmd) { |
|
263 case "NULL": |
|
264 // ELF_C_NULL has the same enum ordinal on both Linux and SunOS |
|
265 intVal = jdk.tools.jaotc.jnilibelf.linux.Elf_Cmd.ELF_C_NULL.ordinal(); |
|
266 break; |
|
267 |
|
268 case "READ": |
|
269 // ELF_C_READ has the same enum ordinal on both Linux and SunOS |
|
270 intVal = jdk.tools.jaotc.jnilibelf.linux.Elf_Cmd.ELF_C_READ.ordinal(); |
|
271 break; |
|
272 |
|
273 // Enums defined in libelf.h of both Linux and SunOS |
|
274 // but with different ordinals |
|
275 case "RDWR": |
|
276 if (JNIELFTargetInfo.getOsName().equals("linux")) { |
|
277 intVal = jdk.tools.jaotc.jnilibelf.linux.Elf_Cmd.ELF_C_RDWR.ordinal(); |
|
278 } else if (JNIELFTargetInfo.getOsName().equals("sunos")) { |
|
279 intVal = jdk.tools.jaotc.jnilibelf.sunos.Elf_Cmd.ELF_C_RDWR.ordinal(); |
|
280 } else { |
|
281 // Unsupported platform |
|
282 intVal = -1; |
|
283 } |
|
284 break; |
|
285 |
|
286 case "WRITE": |
|
287 if (JNIELFTargetInfo.getOsName().equals("linux")) { |
|
288 intVal = jdk.tools.jaotc.jnilibelf.linux.Elf_Cmd.ELF_C_WRITE.ordinal(); |
|
289 } else if (JNIELFTargetInfo.getOsName().equals("sunos")) { |
|
290 intVal = jdk.tools.jaotc.jnilibelf.sunos.Elf_Cmd.ELF_C_WRITE.ordinal(); |
|
291 } else { |
|
292 // Unsupported platform |
|
293 intVal = -1; |
|
294 } |
|
295 break; |
|
296 |
|
297 case "CLR": |
|
298 if (JNIELFTargetInfo.getOsName().equals("linux")) { |
|
299 intVal = jdk.tools.jaotc.jnilibelf.linux.Elf_Cmd.ELF_C_CLR.ordinal(); |
|
300 } else if (JNIELFTargetInfo.getOsName().equals("sunos")) { |
|
301 intVal = jdk.tools.jaotc.jnilibelf.sunos.Elf_Cmd.ELF_C_CLR.ordinal(); |
|
302 } else { |
|
303 // Unsupported platform |
|
304 intVal = -1; |
|
305 } |
|
306 break; |
|
307 |
|
308 case "SET": |
|
309 if (JNIELFTargetInfo.getOsName().equals("linux")) { |
|
310 intVal = jdk.tools.jaotc.jnilibelf.linux.Elf_Cmd.ELF_C_SET.ordinal(); |
|
311 } else if (JNIELFTargetInfo.getOsName().equals("sunos")) { |
|
312 intVal = jdk.tools.jaotc.jnilibelf.sunos.Elf_Cmd.ELF_C_SET.ordinal(); |
|
313 } else { |
|
314 // Unsupported platform |
|
315 intVal = -1; |
|
316 } |
|
317 break; |
|
318 |
|
319 case "FDDONE": |
|
320 if (JNIELFTargetInfo.getOsName().equals("linux")) { |
|
321 intVal = jdk.tools.jaotc.jnilibelf.linux.Elf_Cmd.ELF_C_FDDONE.ordinal(); |
|
322 } else if (JNIELFTargetInfo.getOsName().equals("sunos")) { |
|
323 intVal = jdk.tools.jaotc.jnilibelf.sunos.Elf_Cmd.ELF_C_FDDONE.ordinal(); |
|
324 } else { |
|
325 // Unsupported platform |
|
326 intVal = -1; |
|
327 } |
|
328 break; |
|
329 |
|
330 case "FDREAD": |
|
331 if (JNIELFTargetInfo.getOsName().equals("linux")) { |
|
332 intVal = jdk.tools.jaotc.jnilibelf.linux.Elf_Cmd.ELF_C_FDREAD.ordinal(); |
|
333 } else if (JNIELFTargetInfo.getOsName().equals("sunos")) { |
|
334 intVal = jdk.tools.jaotc.jnilibelf.sunos.Elf_Cmd.ELF_C_FDREAD.ordinal(); |
|
335 } else { |
|
336 // Unsupported platform |
|
337 intVal = -1; |
|
338 } |
|
339 break; |
|
340 |
|
341 case "NUM": |
|
342 if (JNIELFTargetInfo.getOsName().equals("linux")) { |
|
343 intVal = jdk.tools.jaotc.jnilibelf.linux.Elf_Cmd.ELF_C_NUM.ordinal(); |
|
344 } else if (JNIELFTargetInfo.getOsName().equals("sunos")) { |
|
345 intVal = jdk.tools.jaotc.jnilibelf.sunos.Elf_Cmd.ELF_C_NUM.ordinal(); |
|
346 } else { |
|
347 // Unsupported platform |
|
348 intVal = -1; |
|
349 } |
|
350 break; |
|
351 |
|
352 // Linux-only Elf_Cmd enums |
|
353 case "READ_MMAP": |
|
354 if (JNIELFTargetInfo.getOsName().equals("linux")) { |
|
355 intVal = jdk.tools.jaotc.jnilibelf.linux.Elf_Cmd.ELF_C_READ_MMAP.ordinal(); |
|
356 } else { |
|
357 // Unsupported platform |
|
358 intVal = -1; |
|
359 } |
|
360 break; |
|
361 |
|
362 case "RDWR_MMAP": |
|
363 if (JNIELFTargetInfo.getOsName().equals("linux")) { |
|
364 intVal = jdk.tools.jaotc.jnilibelf.linux.Elf_Cmd.ELF_C_RDWR_MMAP.ordinal(); |
|
365 } else { |
|
366 // Unsupported platform |
|
367 intVal = -1; |
|
368 } |
|
369 break; |
|
370 |
|
371 case "WRITE_MMAP": |
|
372 if (JNIELFTargetInfo.getOsName().equals("linux")) { |
|
373 intVal = jdk.tools.jaotc.jnilibelf.linux.Elf_Cmd.ELF_C_WRITE_MMAP.ordinal(); |
|
374 } else { |
|
375 // Unsupported platform |
|
376 intVal = -1; |
|
377 } |
|
378 break; |
|
379 |
|
380 case "READ_MMAP_PRIVATE": |
|
381 if (JNIELFTargetInfo.getOsName().equals("linux")) { |
|
382 intVal = jdk.tools.jaotc.jnilibelf.linux.Elf_Cmd.ELF_C_READ_MMAP_PRIVATE.ordinal(); |
|
383 } else { |
|
384 // Unsupported platform |
|
385 intVal = -1; |
|
386 } |
|
387 break; |
|
388 |
|
389 case "EMPTY": |
|
390 if (JNIELFTargetInfo.getOsName().equals("linux")) { |
|
391 intVal = jdk.tools.jaotc.jnilibelf.linux.Elf_Cmd.ELF_C_EMPTY.ordinal(); |
|
392 } else { |
|
393 // Unsupported platform |
|
394 intVal = -1; |
|
395 } |
|
396 break; |
|
397 // SunOS-only Elf_Cmd enums |
|
398 case "WRIMAGE": |
|
399 if (JNIELFTargetInfo.getOsName().equals("linux")) { |
|
400 intVal = jdk.tools.jaotc.jnilibelf.sunos.Elf_Cmd.ELF_C_WRIMAGE.ordinal(); |
|
401 } else { |
|
402 // Unsupported platform |
|
403 intVal = -1; |
|
404 } |
|
405 break; |
|
406 case "IMAGE": |
|
407 if (JNIELFTargetInfo.getOsName().equals("linux")) { |
|
408 intVal = jdk.tools.jaotc.jnilibelf.sunos.Elf_Cmd.ELF_C_IMAGE.ordinal(); |
|
409 } else { |
|
410 // Unsupported platform |
|
411 intVal = -1; |
|
412 } |
|
413 break; |
|
414 default: |
|
415 intVal = -1; |
|
416 } |
|
417 } |
|
418 |
|
419 public int intValue() { |
|
420 assert intVal != -1 : "enum " + name + "not supported on " + JNIELFTargetInfo.getOsName(); |
|
421 return intVal; |
|
422 } |
|
423 |
|
424 public String getName() { |
|
425 return name; |
|
426 } |
|
427 } |
|
428 |
|
429 public static enum Elf_Type { |
|
430 ELF_T_BYTE(0), /* unsigned char */ |
|
431 ELF_T_ADDR(1), /* Elf32_Addr, Elf64_Addr, ... */ |
|
432 ELF_T_DYN(2), /* Dynamic section record. */ |
|
433 ELF_T_EHDR(3), /* ELF header. */ |
|
434 ELF_T_HALF(4), /* Elf32_Half, Elf64_Half, ... */ |
|
435 ELF_T_OFF(5), /* Elf32_Off, Elf64_Off, ... */ |
|
436 ELF_T_PHDR(6), /* Program header. */ |
|
437 ELF_T_RELA(7), /* Relocation entry with addend. */ |
|
438 ELF_T_REL(8), /* Relocation entry. */ |
|
439 ELF_T_SHDR(9), /* Section header. */ |
|
440 ELF_T_SWORD(10), /* Elf32_Sword, Elf64_Sword, ... */ |
|
441 ELF_T_SYM(11), /* Symbol record. */ |
|
442 ELF_T_WORD(12), /* Elf32_Word, Elf64_Word, ... */ |
|
443 ELF_T_XWORD(13), /* Elf32_Xword, Elf64_Xword, ... */ |
|
444 ELF_T_SXWORD(14), /* Elf32_Sxword, Elf64_Sxword, ... */ |
|
445 ELF_T_VDEF(15), /* Elf32_Verdef, Elf64_Verdef, ... */ |
|
446 ELF_T_VDAUX(16), /* Elf32_Verdaux, Elf64_Verdaux, ... */ |
|
447 ELF_T_VNEED(17), /* Elf32_Verneed, Elf64_Verneed, ... */ |
|
448 ELF_T_VNAUX(18), /* Elf32_Vernaux, Elf64_Vernaux, ... */ |
|
449 ELF_T_NHDR(19), /* Elf32_Nhdr, Elf64_Nhdr, ... */ |
|
450 ELF_T_SYMINFO(20), /* Elf32_Syminfo, Elf64_Syminfo, ... */ |
|
451 ELF_T_MOVE(21), /* Elf32_Move, Elf64_Move, ... */ |
|
452 ELF_T_LIB(22), /* Elf32_Lib, Elf64_Lib, ... */ |
|
453 ELF_T_GNUHASH(23), /* GNU-style hash section. */ |
|
454 ELF_T_AUXV(24), /* Elf32_auxv_t, Elf64_auxv_t, ... */ |
|
455 /* Keep this the last entry. */ |
|
456 ELF_T_NUM(25); |
|
457 |
|
458 private final int intVal; |
|
459 |
|
460 private Elf_Type(int v) { |
|
461 intVal = v; |
|
462 } |
|
463 |
|
464 public int intValue() { |
|
465 return intVal; |
|
466 } |
|
467 } |
|
468 |
|
469 /* Flags for the ELF structures. */ |
|
470 int ELF_F_DIRTY = 0x1; |
|
471 int ELF_F_LAYOUT = 0x4; |
|
472 int ELF_F_PERMISSIVE = 0x8; |
|
473 |
|
474 public static enum Elf_Kind { |
|
475 ELF_K_NONE(0), /* Unknown. */ |
|
476 ELF_K_AR(1), /* Archive. */ |
|
477 ELF_K_COFF(2), /* Stupid old COFF. */ |
|
478 ELF_K_ELF(3), /* ELF file. */ |
|
479 /* Keep this the last entry. */ |
|
480 ELF_K_NUM(4); |
|
481 private final int intVal; |
|
482 |
|
483 private Elf_Kind(int v) { |
|
484 intVal = v; |
|
485 } |
|
486 |
|
487 public int intValue() { |
|
488 return intVal; |
|
489 } |
|
490 } |
|
491 } |
|
492 |
|
493 /** |
|
494 * Invoke native libelf function unsigned int elf_version (unsigned int v). |
|
495 * |
|
496 * @param v version |
|
497 * @return return value of native call |
|
498 */ |
|
499 // Checkstyle: stop method name check |
|
500 static native int elf_version(int v); |
|
501 |
|
502 /** |
|
503 * Return version recorded in libelfshim. |
|
504 * |
|
505 * @return return version string |
|
506 */ |
|
507 // Checkstyle: stop method name check |
|
508 static native String elfshim_version(); |
|
509 |
|
510 /** |
|
511 * Invoke native libelf function Elf *elf_begin (int fildes, Elf_Cmd cmd, Elf *elfPtr). |
|
512 * |
|
513 * @param fildes open file descriptor |
|
514 * @param elfCRead command |
|
515 * @param elfHdrPtr pointer to ELF header |
|
516 * @return return value of native call |
|
517 */ |
|
518 static native Pointer elf_begin(int fildes, int elfCRead, Pointer elfHdrPtr); |
|
519 |
|
520 /** |
|
521 * Invoke native libelf function elf_end (Elf *elfPtr). |
|
522 * |
|
523 * @param elfPtr pointer to ELF header |
|
524 * @return return value of native call |
|
525 */ |
|
526 static native int elf_end(Pointer elfPtr); |
|
527 |
|
528 /** |
|
529 * Invoke native libelf function elf_end (Elf *elfPtr). |
|
530 * |
|
531 * @param elfPtr pointer to ELF header |
|
532 * @return return value of native call |
|
533 */ |
|
534 static native int elf_kind(Pointer elfPtr); |
|
535 |
|
536 /** |
|
537 * Invoke native libelf function unsigned int elf_flagphdr (Elf *elf, Elf_Cmd cmd, unsigned int |
|
538 * flags). |
|
539 * |
|
540 * @param elfPtr Pointer to ELF descriptor |
|
541 * @param cmd command |
|
542 * @param flags flags |
|
543 * @return return value of native call |
|
544 */ |
|
545 static native int elf_flagphdr(Pointer elfPtr, int cmd, int flags); |
|
546 |
|
547 /** |
|
548 * Invoke native libelf function Elf_Scn *elf_newscn (Elf *elfPtr). |
|
549 * |
|
550 * @param elfPtr Elf header pointer |
|
551 * @return return value of native call |
|
552 */ |
|
553 static native Pointer elf_newscn(Pointer elfPtr); |
|
554 |
|
555 /** |
|
556 * Invoke native libelf function Elf_Data *elf_newdata (Elf_Scn *scn). |
|
557 * |
|
558 * @param scnPtr pointer to section for which the new data descriptor is to be created |
|
559 * @return return value of native call |
|
560 */ |
|
561 static native Pointer elf_newdata(Pointer scnPtr); |
|
562 |
|
563 /** |
|
564 * Invoke native libelf function Elf64_Shdr *elf64_getshdr (Elf_Scn *scnPtr). |
|
565 * |
|
566 * @param scnPtr pointer to section whose header information is to be retrieved |
|
567 * @return return value of native call |
|
568 */ |
|
569 static native Pointer elf64_getshdr(Pointer scnPtr); |
|
570 |
|
571 /** |
|
572 * Invoke native libelf function loff_t elf_update (Elf *elfPtr, Elf_Cmd cmd). |
|
573 * |
|
574 * @param elfPtr Pointer to ELF descriptor |
|
575 * @param cmd command |
|
576 * @return return value of native call |
|
577 */ |
|
578 static native long elf_update(Pointer elfPtr, int cmd); |
|
579 |
|
580 /** |
|
581 * Invoke native libelf function char *elf_errmsg (int error). |
|
582 * |
|
583 * @param error error |
|
584 * @return return value of native call |
|
585 */ |
|
586 static native String elf_errmsg(int error); |
|
587 |
|
588 /** |
|
589 * Invoke native libelf function size_t elf_ndxscn (Elf_Scn *scn). |
|
590 * |
|
591 * @param scn section pointer |
|
592 * @return return value of native call |
|
593 */ |
|
594 static native int elf_ndxscn(Pointer scn); |
|
595 |
|
596 /** |
|
597 * GELF interfaces |
|
598 */ |
|
599 /** |
|
600 * Invoke native libelf function unsigned long int gelf_newehdr (Elf *elf, int elfClass). |
|
601 * |
|
602 * @param elf ELF Header pointer |
|
603 * @param elfclass ELF class |
|
604 * @return return value of native call boxed as a pointer |
|
605 */ |
|
606 static native Pointer gelf_newehdr(Pointer elf, int elfclass); |
|
607 |
|
608 /** |
|
609 * Invoke native libelf function unsigned long int gelf_newphdr (Elf *elf, size_t phnum). |
|
610 * |
|
611 * @param elf ELF header pointer |
|
612 * @param phnum number of program headers |
|
613 * @return return value of native call boxed as a pointer |
|
614 */ |
|
615 static native Pointer gelf_newphdr(Pointer elf, int phnum); |
|
616 |
|
617 /** |
|
618 * Miscellaneous convenience native methods that help peek and poke ELF data structures. |
|
619 */ |
|
620 static native int size_of_Sym(int elfClass); |
|
621 |
|
622 static native int size_of_Rela(int elfClass); |
|
623 |
|
624 static native int size_of_Rel(int elfClass); |
|
625 |
|
626 static native void ehdr_set_data_encoding(Pointer ehdr, int val); |
|
627 |
|
628 static native void set_Ehdr_e_machine(int elfclass, Pointer structPtr, int val); |
|
629 |
|
630 static native void set_Ehdr_e_type(int elfclass, Pointer structPtr, int val); |
|
631 |
|
632 static native void set_Ehdr_e_version(int elfclass, Pointer structPtr, int val); |
|
633 |
|
634 static native void set_Ehdr_e_shstrndx(int elfclass, Pointer structPtr, int val); |
|
635 |
|
636 static native void phdr_set_type_self(int elfclass, Pointer ehdr, Pointer phdr); |
|
637 |
|
638 static native void set_Shdr_sh_name(int elfclass, Pointer structPtr, int val); |
|
639 |
|
640 static native void set_Shdr_sh_type(int elfclass, Pointer structPtr, int val); |
|
641 |
|
642 static native void set_Shdr_sh_flags(int elfclass, Pointer structPtr, int val); |
|
643 |
|
644 static native void set_Shdr_sh_entsize(int elfclass, Pointer structPtr, int val); |
|
645 |
|
646 static native void set_Shdr_sh_link(int elfclass, Pointer structPtr, int val); |
|
647 |
|
648 static native void set_Shdr_sh_info(int elfclass, Pointer structPtr, int val); |
|
649 |
|
650 static native void set_Data_d_align(Pointer structPtr, int val); |
|
651 |
|
652 static native void set_Data_d_off(Pointer structPtr, int val); |
|
653 |
|
654 static native void set_Data_d_buf(Pointer structPtr, Pointer val); |
|
655 |
|
656 static native void set_Data_d_type(Pointer structPtr, int val); |
|
657 |
|
658 static native void set_Data_d_size(Pointer structPtr, int val); |
|
659 |
|
660 static native void set_Data_d_version(Pointer structPtr, int val); |
|
661 |
|
662 static native long create_sym_entry(int elfclass, int index, int type, int bind, int shndx, int size, int value); |
|
663 |
|
664 static native long create_reloc_entry(int elfclass, int roffset, int symtabIdx, int relocType, int raddend, int reloca); |
|
665 |
|
666 /** |
|
667 * File Operations. |
|
668 */ |
|
669 static native int open_rw(String fileName); |
|
670 |
|
671 static native int open(String fileName, int flags); |
|
672 |
|
673 static native int open(String fileName, int flags, int mode); |
|
674 |
|
675 static native int close(int fd); |
|
676 // Checkstyle: resume method name check |
|
677 } |
|