hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc.jnilibelf/src/jdk/tools/jaotc/jnilibelf/JNILibELFAPI.java
changeset 46289 1904e7ec236e
parent 43915 4a79ad46e578
parent 46288 5104e67b9143
child 46290 3c4c1591507d
equal deleted inserted replaced
43915:4a79ad46e578 46289:1904e7ec236e
     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 }