(linenum→info "unix/slp.c:2238")

qemu/0.9.1/elf.h

    1: #ifndef _QEMU_ELF_H
    2: #define _QEMU_ELF_H
    3: 
    4: #include <inttypes.h>
    5: 
    6: /* 32-bit ELF base types. */
    7: typedef uint32_t Elf32_Addr;
    8: typedef uint16_t Elf32_Half;
    9: typedef uint32_t Elf32_Off;
   10: typedef int32_t  Elf32_Sword;
   11: typedef uint32_t Elf32_Word;
   12: 
   13: /* 64-bit ELF base types. */
   14: typedef uint64_t Elf64_Addr;
   15: typedef uint16_t Elf64_Half;
   16: typedef int16_t  Elf64_SHalf;
   17: typedef uint64_t Elf64_Off;
   18: typedef int32_t  Elf64_Sword;
   19: typedef uint32_t Elf64_Word;
   20: typedef uint64_t Elf64_Xword;
   21: typedef int64_t  Elf64_Sxword;
   22: 
   23: /* These constants are for the segment types stored in the image headers */
   24: #define PT_NULL    0
   25: #define PT_LOAD    1
   26: #define PT_DYNAMIC 2
   27: #define PT_INTERP  3
   28: #define PT_NOTE    4
   29: #define PT_SHLIB   5
   30: #define PT_PHDR    6
   31: #define PT_LOPROC  0x70000000
   32: #define PT_HIPROC  0x7fffffff
   33: #define PT_MIPS_REGINFO         0x70000000
   34: #define PT_MIPS_OPTIONS         0x70000001
   35: 
   36: /* Flags in the e_flags field of the header */
   37: /* MIPS architecture level. */
   38: #define EF_MIPS_ARCH_1          0x00000000      /* -mips1 code.  */
   39: #define EF_MIPS_ARCH_2          0x10000000      /* -mips2 code.  */
   40: #define EF_MIPS_ARCH_3          0x20000000      /* -mips3 code.  */
   41: #define EF_MIPS_ARCH_4          0x30000000      /* -mips4 code.  */
   42: #define EF_MIPS_ARCH_5          0x40000000      /* -mips5 code.  */
   43: #define EF_MIPS_ARCH_32         0x50000000     /* MIPS32 code.  */
   44: #define EF_MIPS_ARCH_64         0x60000000     /* MIPS64 code.  */
   45: 
   46: /* The ABI of a file. */
   47: #define EF_MIPS_ABI_O32         0x00001000     /* O32 ABI.  */
   48: #define EF_MIPS_ABI_O64         0x00002000     /* O32 extended for 64 bit.  */
   49: 
   50: #define EF_MIPS_NOREORDER 0x00000001
   51: #define EF_MIPS_PIC       0x00000002
   52: #define EF_MIPS_CPIC      0x00000004
   53: #define EF_MIPS_ABI2            0x00000020
   54: #define EF_MIPS_OPTIONS_FIRST   0x00000080
   55: #define EF_MIPS_32BITMODE       0x00000100
   56: #define EF_MIPS_ABI             0x0000f000
   57: #define EF_MIPS_ARCH      0xf0000000
   58: 
   59: /* These constants define the different elf file types */
   60: #define ET_NONE   0
   61: #define ET_REL    1
   62: #define ET_EXEC   2
   63: #define ET_DYN    3
   64: #define ET_CORE   4
   65: #define ET_LOPROC 0xff00
   66: #define ET_HIPROC 0xffff
   67: 
   68: /* These constants define the various ELF target machines */
   69: #define EM_NONE  0
   70: #define EM_M32   1
   71: #define EM_SPARC 2
   72: #define EM_386   3
   73: #define EM_68K   4
   74: #define EM_88K   5
   75: #define EM_486   6   /* Perhaps disused */
   76: #define EM_860   7
   77: 
   78: #define EM_MIPS         8      /* MIPS R3000 (officially, big-endian only) */
   79: 
   80: #define EM_MIPS_RS4_BE 10       /* MIPS R4000 big-endian */
   81: 
   82: #define EM_PARISC      15       /* HPPA */
   83: 
   84: #define EM_SPARC32PLUS 18       /* Sun's "v8plus" */
   85: 
   86: #define EM_PPC         20        /* PowerPC */
   87: #define EM_PPC64       21       /* PowerPC64 */
   88: 
   89: #define EM_ARM          40              /* ARM */
   90: 
   91: #define EM_SH          42 /* SuperH */
   92: 
   93: #define EM_SPARCV9     43       /* SPARC v9 64-bit */
   94: 
   95: #define EM_IA_64        50     /* HP/Intel IA-64 */
   96: 
   97: #define EM_X86_64       62    /* AMD x86-64 */
   98: 
   99: #define EM_S390         22     /* IBM S/390 */
  100: 
  101: #define EM_CRIS         76      /* Axis Communications 32-bit embedded processor */
  102: 
  103: #define EM_V850         87     /* NEC v850 */
  104: 
  105: #define EM_H8_300H      47      /* Hitachi H8/300H */
  106: #define EM_H8S          48      /* Hitachi H8S     */
  107: 
  108: /*
  109:  * This is an interim value that we will use until the committee comes
  110:  * up with a final number.
  111:  */
  112: #define EM_ALPHA        0x9026
  113: 
  114: /* Bogus old v850 magic number, used by old tools.  */
  115: #define EM_CYGNUS_V850  0x9080
  116: 
  117: /*
  118:  * This is the old interim value for S/390 architecture
  119:  */
  120: #define EM_S390_OLD     0xA390
  121: 
  122: /* This is the info that is needed to parse the dynamic section of the file */
  123: #define DT_NULL         0
  124: #define DT_NEEDED       1
  125: #define DT_PLTRELSZ     2
  126: #define DT_PLTGOT       3
  127: #define DT_HASH         4
  128: #define DT_STRTAB       5
  129: #define DT_SYMTAB       6
  130: #define DT_RELA         7
  131: #define DT_RELASZ       8
  132: #define DT_RELAENT      9
  133: #define DT_STRSZ        10
  134: #define DT_SYMENT       11
  135: #define DT_INIT         12
  136: #define DT_FINI         13
  137: #define DT_SONAME       14
  138: #define DT_RPATH        15
  139: #define DT_SYMBOLIC     16
  140: #define DT_REL          17
  141: #define DT_RELSZ        18
  142: #define DT_RELENT       19
  143: #define DT_PLTREL       20
  144: #define DT_DEBUG        21
  145: #define DT_TEXTREL      22
  146: #define DT_JMPREL       23
  147: #define DT_LOPROC       0x70000000
  148: #define DT_HIPROC       0x7fffffff
  149: #define DT_MIPS_RLD_VERSION     0x70000001
  150: #define DT_MIPS_TIME_STAMP      0x70000002
  151: #define DT_MIPS_ICHECKSUM       0x70000003
  152: #define DT_MIPS_IVERSION        0x70000004
  153: #define DT_MIPS_FLAGS           0x70000005
  154:   #define RHF_NONE                0
  155:   #define RHF_HARDWAY             1
  156:   #define RHF_NOTPOT              2
  157: #define DT_MIPS_BASE_ADDRESS    0x70000006
  158: #define DT_MIPS_CONFLICT        0x70000008
  159: #define DT_MIPS_LIBLIST         0x70000009
  160: #define DT_MIPS_LOCAL_GOTNO     0x7000000a
  161: #define DT_MIPS_CONFLICTNO      0x7000000b
  162: #define DT_MIPS_LIBLISTNO       0x70000010
  163: #define DT_MIPS_SYMTABNO        0x70000011
  164: #define DT_MIPS_UNREFEXTNO      0x70000012
  165: #define DT_MIPS_GOTSYM          0x70000013
  166: #define DT_MIPS_HIPAGENO        0x70000014
  167: #define DT_MIPS_RLD_MAP         0x70000016
  168: 
  169: /* This info is needed when parsing the symbol table */
  170: #define STB_LOCAL  0
  171: #define STB_GLOBAL 1
  172: #define STB_WEAK   2
  173: 
  174: #define STT_NOTYPE  0
  175: #define STT_OBJECT  1
  176: #define STT_FUNC    2
  177: #define STT_SECTION 3
  178: #define STT_FILE    4
  179: 
  180: #define ELF_ST_BIND(x)          ((x) >> 4)
  181: #define ELF_ST_TYPE(x)          (((unsigned int) x) & 0xf)
  182: #define ELF32_ST_BIND(x)        ELF_ST_BIND(x)
  183: #define ELF32_ST_TYPE(x)        ELF_ST_TYPE(x)
  184: #define ELF64_ST_BIND(x)        ELF_ST_BIND(x)
  185: #define ELF64_ST_TYPE(x)        ELF_ST_TYPE(x)
  186: 
  187: /* Symbolic values for the entries in the auxiliary table
  188:    put on the initial stack */
  189: #define AT_NULL   0     /* end of vector */
  190: #define AT_IGNORE 1     /* entry should be ignored */
  191: #define AT_EXECFD 2     /* file descriptor of program */
  192: #define AT_PHDR   3     /* program headers for program */
  193: #define AT_PHENT  4     /* size of program header entry */
  194: #define AT_PHNUM  5     /* number of program headers */
  195: #define AT_PAGESZ 6     /* system page size */
  196: #define AT_BASE   7     /* base address of interpreter */
  197: #define AT_FLAGS  8     /* flags */
  198: #define AT_ENTRY  9     /* entry point of program */
  199: #define AT_NOTELF 10    /* program is not ELF */
  200: #define AT_UID    11    /* real uid */
  201: #define AT_EUID   12    /* effective uid */
  202: #define AT_GID    13    /* real gid */
  203: #define AT_EGID   14    /* effective gid */
  204: #define AT_PLATFORM 15  /* string identifying CPU for optimizations */
  205: #define AT_HWCAP  16    /* arch dependent hints at CPU capabilities */
  206: #define AT_CLKTCK 17    /* frequency at which times() increments */
  207: 
  208: typedef struct dynamic{
  209:   Elf32_Sword d_tag;
  210:   union{
  211:     Elf32_Sword d_val;
  212:     Elf32_Addr  d_ptr;
  213:   } d_un;
  214: } Elf32_Dyn;
  215: 
  216: typedef struct {
  217:   Elf64_Sxword d_tag;           /* entry tag value */
  218:   union {
  219:     Elf64_Xword d_val;
  220:     Elf64_Addr d_ptr;
  221:   } d_un;
  222: } Elf64_Dyn;
  223: 
  224: /* The following are used with relocations */
  225: #define ELF32_R_SYM(x) ((x) >> 8)
  226: #define ELF32_R_TYPE(x) ((x) & 0xff)
  227: 
  228: #define ELF64_R_SYM(i)                  ((i) >> 32)
  229: #define ELF64_R_TYPE(i)                 ((i) & 0xffffffff)
  230: #define ELF64_R_TYPE_DATA(i)            (((ELF64_R_TYPE(i) >> 8) ^ 0x00800000) - 0x00800000)
  231: 
  232: #define R_386_NONE      0
  233: #define R_386_32        1
  234: #define R_386_PC32      2
  235: #define R_386_GOT32     3
  236: #define R_386_PLT32     4
  237: #define R_386_COPY      5
  238: #define R_386_GLOB_DAT  6
  239: #define R_386_JMP_SLOT  7
  240: #define R_386_RELATIVE  8
  241: #define R_386_GOTOFF    9
  242: #define R_386_GOTPC     10
  243: #define R_386_NUM       11
  244: 
  245: #define R_MIPS_NONE             0
  246: #define R_MIPS_16               1
  247: #define R_MIPS_32               2
  248: #define R_MIPS_REL32            3
  249: #define R_MIPS_26               4
  250: #define R_MIPS_HI16             5
  251: #define R_MIPS_LO16             6
  252: #define R_MIPS_GPREL16          7
  253: #define R_MIPS_LITERAL          8
  254: #define R_MIPS_GOT16            9
  255: #define R_MIPS_PC16             10
  256: #define R_MIPS_CALL16           11
  257: #define R_MIPS_GPREL32          12
  258: /* The remaining relocs are defined on Irix, although they are not
  259:    in the MIPS ELF ABI.  */
  260: #define R_MIPS_UNUSED1          13
  261: #define R_MIPS_UNUSED2          14
  262: #define R_MIPS_UNUSED3          15
  263: #define R_MIPS_SHIFT5           16
  264: #define R_MIPS_SHIFT6           17
  265: #define R_MIPS_64               18
  266: #define R_MIPS_GOT_DISP         19
  267: #define R_MIPS_GOT_PAGE         20
  268: #define R_MIPS_GOT_OFST         21
  269: /*
  270:  * The following two relocation types are specified in the MIPS ABI
  271:  * conformance guide version 1.2 but not yet in the psABI.
  272:  */
  273: #define R_MIPS_GOTHI16          22
  274: #define R_MIPS_GOTLO16          23
  275: #define R_MIPS_SUB              24
  276: #define R_MIPS_INSERT_A         25
  277: #define R_MIPS_INSERT_B         26
  278: #define R_MIPS_DELETE           27
  279: #define R_MIPS_HIGHER           28
  280: #define R_MIPS_HIGHEST          29
  281: /*
  282:  * The following two relocation types are specified in the MIPS ABI
  283:  * conformance guide version 1.2 but not yet in the psABI.
  284:  */
  285: #define R_MIPS_CALLHI16         30
  286: #define R_MIPS_CALLLO16         31
  287: /*
  288:  * This range is reserved for vendor specific relocations.
  289:  */
  290: #define R_MIPS_LOVENDOR         100
  291: #define R_MIPS_HIVENDOR         127
  292: 
  293: 
  294: /*
  295:  * Sparc ELF relocation types
  296:  */
  297: #define R_SPARC_NONE            0
  298: #define R_SPARC_8               1
  299: #define R_SPARC_16              2
  300: #define R_SPARC_32              3
  301: #define R_SPARC_DISP8           4
  302: #define R_SPARC_DISP16          5
  303: #define R_SPARC_DISP32          6
  304: #define R_SPARC_WDISP30         7
  305: #define R_SPARC_WDISP22         8
  306: #define R_SPARC_HI22            9
  307: #define R_SPARC_22              10
  308: #define R_SPARC_13              11
  309: #define R_SPARC_LO10            12
  310: #define R_SPARC_GOT10           13
  311: #define R_SPARC_GOT13           14
  312: #define R_SPARC_GOT22           15
  313: #define R_SPARC_PC10            16
  314: #define R_SPARC_PC22            17
  315: #define R_SPARC_WPLT30          18
  316: #define R_SPARC_COPY            19
  317: #define R_SPARC_GLOB_DAT        20
  318: #define R_SPARC_JMP_SLOT        21
  319: #define R_SPARC_RELATIVE        22
  320: #define R_SPARC_UA32            23
  321: #define R_SPARC_PLT32           24
  322: #define R_SPARC_HIPLT22         25
  323: #define R_SPARC_LOPLT10         26
  324: #define R_SPARC_PCPLT32         27
  325: #define R_SPARC_PCPLT22         28
  326: #define R_SPARC_PCPLT10         29
  327: #define R_SPARC_10              30
  328: #define R_SPARC_11              31
  329: #define R_SPARC_64              32
  330: #define R_SPARC_OLO10           33
  331: #define R_SPARC_HH22            34
  332: #define R_SPARC_HM10            35
  333: #define R_SPARC_LM22            36
  334: #define R_SPARC_WDISP16         40
  335: #define R_SPARC_WDISP19         41
  336: #define R_SPARC_7               43
  337: #define R_SPARC_5               44
  338: #define R_SPARC_6               45
  339: 
  340: /* Bits present in AT_HWCAP, primarily for Sparc32.  */
  341: 
  342: #define HWCAP_SPARC_FLUSH       1    /* CPU supports flush instruction. */
  343: #define HWCAP_SPARC_STBAR       2
  344: #define HWCAP_SPARC_SWAP        4
  345: #define HWCAP_SPARC_MULDIV      8
  346: #define HWCAP_SPARC_V9          16
  347: #define HWCAP_SPARC_ULTRA3      32
  348: 
  349: /*
  350:  * 68k ELF relocation types
  351:  */
  352: #define R_68K_NONE      0
  353: #define R_68K_32        1
  354: #define R_68K_16        2
  355: #define R_68K_8         3
  356: #define R_68K_PC32      4
  357: #define R_68K_PC16      5
  358: #define R_68K_PC8       6
  359: #define R_68K_GOT32     7
  360: #define R_68K_GOT16     8
  361: #define R_68K_GOT8      9
  362: #define R_68K_GOT32O    10
  363: #define R_68K_GOT16O    11
  364: #define R_68K_GOT8O     12
  365: #define R_68K_PLT32     13
  366: #define R_68K_PLT16     14
  367: #define R_68K_PLT8      15
  368: #define R_68K_PLT32O    16
  369: #define R_68K_PLT16O    17
  370: #define R_68K_PLT8O     18
  371: #define R_68K_COPY      19
  372: #define R_68K_GLOB_DAT  20
  373: #define R_68K_JMP_SLOT  21
  374: #define R_68K_RELATIVE  22
  375: 
  376: /*
  377:  * Alpha ELF relocation types
  378:  */
  379: #define R_ALPHA_NONE            0       /* No reloc */
  380: #define R_ALPHA_REFLONG         1       /* Direct 32 bit */
  381: #define R_ALPHA_REFQUAD         2       /* Direct 64 bit */
  382: #define R_ALPHA_GPREL32         3       /* GP relative 32 bit */
  383: #define R_ALPHA_LITERAL         4       /* GP relative 16 bit w/optimization */
  384: #define R_ALPHA_LITUSE          5       /* Optimization hint for LITERAL */
  385: #define R_ALPHA_GPDISP          6       /* Add displacement to GP */
  386: #define R_ALPHA_BRADDR          7       /* PC+4 relative 23 bit shifted */
  387: #define R_ALPHA_HINT            8       /* PC+4 relative 16 bit shifted */
  388: #define R_ALPHA_SREL16          9       /* PC relative 16 bit */
  389: #define R_ALPHA_SREL32          10      /* PC relative 32 bit */
  390: #define R_ALPHA_SREL64          11      /* PC relative 64 bit */
  391: #define R_ALPHA_GPRELHIGH       17      /* GP relative 32 bit, high 16 bits */
  392: #define R_ALPHA_GPRELLOW        18      /* GP relative 32 bit, low 16 bits */
  393: #define R_ALPHA_GPREL16         19      /* GP relative 16 bit */
  394: #define R_ALPHA_COPY            24      /* Copy symbol at runtime */
  395: #define R_ALPHA_GLOB_DAT        25      /* Create GOT entry */
  396: #define R_ALPHA_JMP_SLOT        26      /* Create PLT entry */
  397: #define R_ALPHA_RELATIVE        27      /* Adjust by program base */
  398: #define R_ALPHA_BRSGP           28
  399: #define R_ALPHA_TLSGD           29
  400: #define R_ALPHA_TLS_LDM         30
  401: #define R_ALPHA_DTPMOD64        31
  402: #define R_ALPHA_GOTDTPREL       32
  403: #define R_ALPHA_DTPREL64        33
  404: #define R_ALPHA_DTPRELHI        34
  405: #define R_ALPHA_DTPRELLO        35
  406: #define R_ALPHA_DTPREL16        36
  407: #define R_ALPHA_GOTTPREL        37
  408: #define R_ALPHA_TPREL64         38
  409: #define R_ALPHA_TPRELHI         39
  410: #define R_ALPHA_TPRELLO         40
  411: #define R_ALPHA_TPREL16         41
  412: 
  413: #define SHF_ALPHA_GPREL         0x10000000
  414: 
  415: 
  416: /* PowerPC relocations defined by the ABIs */
  417: #define R_PPC_NONE              0
  418: #define R_PPC_ADDR32            1 /* 32bit absolute address */
  419: #define R_PPC_ADDR24            2 /* 26bit address, 2 bits ignored.  */
  420: #define R_PPC_ADDR16            3 /* 16bit absolute address */
  421: #define R_PPC_ADDR16_LO         4      /* lower 16bit of absolute address */
  422: #define R_PPC_ADDR16_HI         5      /* high 16bit of absolute address */
  423: #define R_PPC_ADDR16_HA         6      /* adjusted high 16bit */
  424: #define R_PPC_ADDR14            7 /* 16bit address, 2 bits ignored */
  425: #define R_PPC_ADDR14_BRTAKEN    8
  426: #define R_PPC_ADDR14_BRNTAKEN   9
  427: #define R_PPC_REL24             10 /* PC relative 26 bit */
  428: #define R_PPC_REL14             11 /* PC relative 16 bit */
  429: #define R_PPC_REL14_BRTAKEN     12
  430: #define R_PPC_REL14_BRNTAKEN    13
  431: #define R_PPC_GOT16             14
  432: #define R_PPC_GOT16_LO          15
  433: #define R_PPC_GOT16_HI          16
  434: #define R_PPC_GOT16_HA          17
  435: #define R_PPC_PLTREL24          18
  436: #define R_PPC_COPY              19
  437: #define R_PPC_GLOB_DAT          20
  438: #define R_PPC_JMP_SLOT          21
  439: #define R_PPC_RELATIVE          22
  440: #define R_PPC_LOCAL24PC         23
  441: #define R_PPC_UADDR32           24
  442: #define R_PPC_UADDR16           25
  443: #define R_PPC_REL32             26
  444: #define R_PPC_PLT32             27
  445: #define R_PPC_PLTREL32          28
  446: #define R_PPC_PLT16_LO          29
  447: #define R_PPC_PLT16_HI          30
  448: #define R_PPC_PLT16_HA          31
  449: #define R_PPC_SDAREL16          32
  450: #define R_PPC_SECTOFF           33
  451: #define R_PPC_SECTOFF_LO        34
  452: #define R_PPC_SECTOFF_HI        35
  453: #define R_PPC_SECTOFF_HA        36
  454: /* Keep this the last entry.  */
  455: #define R_PPC_NUM               37
  456: 
  457: /* ARM specific declarations */
  458: 
  459: /* Processor specific flags for the ELF header e_flags field.  */
  460: #define EF_ARM_RELEXEC     0x01
  461: #define EF_ARM_HASENTRY    0x02
  462: #define EF_ARM_INTERWORK   0x04
  463: #define EF_ARM_APCS_26     0x08
  464: #define EF_ARM_APCS_FLOAT  0x10
  465: #define EF_ARM_PIC         0x20
  466: #define EF_ALIGN8          0x40         /* 8-bit structure alignment is in use */</