Annotation of nono/host/elf.h, revision 1.1.1.2

1.1       root        1: // NetBSD の elf.h -> sys/exec_elf.h をベースに書き換えたもの
                      2: /*     $NetBSD: exec_elf.h,v 1.161 2019/06/07 23:35:52 christos Exp $  */
1.1.1.2 ! root        3: /*     $OpenBSD: exec_elf.h,v 1.87 2019/12/01 13:10:51 jsg Exp $       */
1.1       root        4: 
                      5: /*-
                      6:  * Copyright (c) 1994 The NetBSD Foundation, Inc.
                      7:  * All rights reserved.
                      8:  *
                      9:  * This code is derived from software contributed to The NetBSD Foundation
                     10:  * by Christos Zoulas.
                     11:  *
                     12:  * Redistribution and use in source and binary forms, with or without
                     13:  * modification, are permitted provided that the following conditions
                     14:  * are met:
                     15:  * 1. Redistributions of source code must retain the above copyright
                     16:  *    notice, this list of conditions and the following disclaimer.
                     17:  * 2. Redistributions in binary form must reproduce the above copyright
                     18:  *    notice, this list of conditions and the following disclaimer in the
                     19:  *    documentation and/or other materials provided with the distribution.
                     20:  *
                     21:  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
                     22:  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
                     23:  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
                     24:  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
                     25:  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
                     26:  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
                     27:  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
                     28:  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
                     29:  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
                     30:  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
                     31:  * POSSIBILITY OF SUCH DAMAGE.
                     32:  */
                     33: 
                     34: #ifndef _SYS_EXEC_ELF_H_
                     35: #define _SYS_EXEC_ELF_H_
                     36: 
                     37: /*
                     38:  * The current ELF ABI specification is available at:
                     39:  *     http://www.sco.com/developers/gabi/
                     40:  *
                     41:  * Current header definitions are in:
                     42:  *     http://www.sco.com/developers/gabi/latest/ch4.eheader.html
                     43:  */
                     44: 
                     45: #if defined(_KERNEL) || defined(_STANDALONE)
                     46: #include <sys/types.h>
                     47: #else
                     48: #include <inttypes.h>
                     49: #include <stddef.h>
                     50: #endif /* _KERNEL || _STANDALONE */
                     51: 
                     52: typedef uint8_t                Elf_Byte;
                     53: 
                     54: typedef uint32_t       Elf32_Addr;
                     55: #define ELF32_FSZ_ADDR 4
                     56: typedef uint32_t       Elf32_Off;
                     57: typedef int32_t                Elf32_SOff;
                     58: #define ELF32_FSZ_OFF  4
                     59: typedef int32_t                Elf32_Sword;
                     60: #define ELF32_FSZ_SWORD 4
                     61: typedef uint32_t       Elf32_Word;
                     62: #define ELF32_FSZ_WORD 4
                     63: typedef uint16_t       Elf32_Half;
                     64: #define ELF32_FSZ_HALF 2
                     65: typedef uint64_t       Elf32_Lword;
                     66: #define ELF32_FSZ_LWORD 8
                     67: 
                     68: typedef uint64_t       Elf64_Addr;
                     69: #define ELF64_FSZ_ADDR 8
                     70: typedef uint64_t       Elf64_Off;
                     71: typedef int64_t                Elf64_SOff;
                     72: #define ELF64_FSZ_OFF  8
                     73: 
                     74: typedef int32_t                Elf64_Sword;
                     75: #define ELF64_FSZ_SWORD 4
                     76: typedef uint32_t       Elf64_Word;
                     77: #define ELF64_FSZ_WORD 4
                     78: 
                     79: typedef int64_t                Elf64_Sxword;
                     80: #define ELF64_FSZ_SXWORD 8
                     81: typedef uint64_t       Elf64_Xword;
                     82: #define ELF64_FSZ_XWORD 8
                     83: typedef uint64_t       Elf64_Lword;
                     84: #define ELF64_FSZ_LWORD 8
                     85: typedef uint16_t       Elf64_Half;
                     86: #define ELF64_FSZ_HALF 2
                     87: 
                     88: /*
                     89:  * ELF Header
                     90:  */
                     91: #define ELF_NIDENT     16
                     92: 
                     93: typedef struct {
                     94:        unsigned char   e_ident[ELF_NIDENT];    /* Id bytes */
                     95:        Elf32_Half      e_type;                 /* file type */
                     96:        Elf32_Half      e_machine;              /* machine type */
                     97:        Elf32_Word      e_version;              /* version number */
                     98:        Elf32_Addr      e_entry;                /* entry point */
                     99:        Elf32_Off       e_phoff;                /* Program hdr offset */
                    100:        Elf32_Off       e_shoff;                /* Section hdr offset */
                    101:        Elf32_Word      e_flags;                /* Processor flags */
                    102:        Elf32_Half      e_ehsize;               /* sizeof ehdr */
                    103:        Elf32_Half      e_phentsize;            /* Program header entry size */
                    104:        Elf32_Half      e_phnum;                /* Number of program headers */
                    105:        Elf32_Half      e_shentsize;            /* Section header entry size */
                    106:        Elf32_Half      e_shnum;                /* Number of section headers */
                    107:        Elf32_Half      e_shstrndx;             /* String table index */
                    108: } Elf32_Ehdr;
                    109: 
                    110: typedef struct {
                    111:        unsigned char   e_ident[ELF_NIDENT];    /* Id bytes */
                    112:        Elf64_Half      e_type;                 /* file type */
                    113:        Elf64_Half      e_machine;              /* machine type */
                    114:        Elf64_Word      e_version;              /* version number */
                    115:        Elf64_Addr      e_entry;                /* entry point */
                    116:        Elf64_Off       e_phoff;                /* Program hdr offset */
                    117:        Elf64_Off       e_shoff;                /* Section hdr offset */
                    118:        Elf64_Word      e_flags;                /* Processor flags */
                    119:        Elf64_Half      e_ehsize;               /* sizeof ehdr */
                    120:        Elf64_Half      e_phentsize;            /* Program header entry size */
                    121:        Elf64_Half      e_phnum;                /* Number of program headers */
                    122:        Elf64_Half      e_shentsize;            /* Section header entry size */
                    123:        Elf64_Half      e_shnum;                /* Number of section headers */
                    124:        Elf64_Half      e_shstrndx;             /* String table index */
                    125: } Elf64_Ehdr;
                    126: 
                    127: /* e_ident offsets */
                    128: #define EI_MAG0                0       /* '\177' */
                    129: #define EI_MAG1                1       /* 'E'    */
                    130: #define EI_MAG2                2       /* 'L'    */
                    131: #define EI_MAG3                3       /* 'F'    */
                    132: #define EI_CLASS       4       /* File class */
                    133: #define EI_DATA                5       /* Data encoding */
                    134: #define EI_VERSION     6       /* File version */
                    135: #define EI_OSABI       7       /* Operating system/ABI identification */
                    136: #define EI_ABIVERSION  8       /* ABI version */
                    137: #define EI_PAD         9       /* Start of padding bytes up to EI_NIDENT*/
                    138: #define EI_NIDENT      16      /* First non-ident header byte */
                    139: 
                    140: /* e_ident[EI_MAG0,EI_MAG3] */
                    141: #define ELFMAG0                0x7f
                    142: #define ELFMAG1                'E'
                    143: #define ELFMAG2                'L'
                    144: #define ELFMAG3                'F'
                    145: #define ELFMAG         "\177ELF"
                    146: #define SELFMAG                4
                    147: 
                    148: /* e_ident[EI_CLASS] */
                    149: #define ELFCLASSNONE   0       /* Invalid class */
                    150: #define ELFCLASS32     1       /* 32-bit objects */
                    151: #define ELFCLASS64     2       /* 64-bit objects */
                    152: #define ELFCLASSNUM    3
                    153: 
                    154: /* e_ident[EI_DATA] */
                    155: #define ELFDATANONE    0       /* Invalid data encoding */
                    156: #define ELFDATA2LSB    1       /* 2's complement values, LSB first */
                    157: #define ELFDATA2MSB    2       /* 2's complement values, MSB first */
                    158: 
                    159: /* e_ident[EI_VERSION] */
                    160: #define EV_NONE                0       /* Invalid version */
                    161: #define EV_CURRENT     1       /* Current version */
                    162: #define EV_NUM         2
                    163: 
                    164: /* e_ident[EI_OSABI] */
                    165: #define ELFOSABI_SYSV          0       /* UNIX System V ABI */
                    166: #define ELFOSABI_HPUX          1       /* HP-UX operating system */
                    167: #define ELFOSABI_NETBSD                2       /* NetBSD */
                    168: #define ELFOSABI_LINUX         3       /* GNU/Linux */
                    169: #define ELFOSABI_HURD          4       /* GNU/Hurd */
                    170: #define ELFOSABI_86OPEN                5       /* 86Open */
                    171: #define ELFOSABI_SOLARIS       6       /* Solaris */
                    172: #define ELFOSABI_MONTEREY      7       /* Monterey */
                    173: #define ELFOSABI_IRIX          8       /* IRIX */
                    174: #define ELFOSABI_FREEBSD       9       /* FreeBSD */
                    175: #define ELFOSABI_TRU64         10      /* TRU64 UNIX */
                    176: #define ELFOSABI_MODESTO       11      /* Novell Modesto */
                    177: #define ELFOSABI_OPENBSD       12      /* OpenBSD */
                    178: #define ELFOSABI_OPENVMS       13      /* OpenVMS */
                    179: #define ELFOSABI_NSK           14      /* HP Non-Stop Kernel */
                    180: #define ELFOSABI_AROS          15      /* Amiga Research OS */
                    181: /* Unofficial OSABIs follow */
                    182: #define ELFOSABI_ARM           97      /* ARM */
                    183: #define ELFOSABI_STANDALONE    255     /* Standalone (embedded) application */
                    184: 
                    185: #define ELFOSABI_NONE          ELFOSABI_SYSV
                    186: #define ELFOSABI_AIX           ELFOSABI_MONTEREY
                    187: 
                    188: /* e_type */
                    189: #define ET_NONE                0       /* No file type */
                    190: #define ET_REL         1       /* Relocatable file */
                    191: #define ET_EXEC                2       /* Executable file */
                    192: #define ET_DYN         3       /* Shared object file */
                    193: #define ET_CORE                4       /* Core file */
                    194: #define ET_NUM         5
                    195: 
                    196: #define ET_LOOS                0xfe00  /* Operating system specific range */
                    197: #define ET_HIOS                0xfeff
                    198: #define ET_LOPROC      0xff00  /* Processor-specific range */
                    199: #define ET_HIPROC      0xffff
                    200: 
                    201: /* e_machine */
                    202: #define EM_NONE                0       /* No machine */
                    203: #define EM_M32         1       /* AT&T WE 32100 */
                    204: #define EM_SPARC       2       /* SPARC */
                    205: #define EM_386         3       /* Intel 80386 */
                    206: #define EM_68K         4       /* Motorola 68000 */
                    207: #define EM_88K         5       /* Motorola 88000 */
                    208: #define EM_486         6       /* Intel 80486 [old] */
                    209: #define EM_IAMCU       6       /* Intel MCU. */
                    210: #define EM_860         7       /* Intel 80860 */
                    211: #define EM_MIPS                8       /* MIPS I Architecture */
                    212: #define EM_S370                9       /* Amdahl UTS on System/370 */
                    213: #define EM_MIPS_RS3_LE 10      /* MIPS RS3000 Little-endian */
                    214:                        /* 11-14 - Reserved */
                    215: #define EM_RS6000      11      /* IBM RS/6000 XXX reserved */
                    216: #define EM_PARISC      15      /* Hewlett-Packard PA-RISC */
                    217: #define EM_NCUBE       16      /* NCube XXX reserved */
                    218: #define EM_VPP500      17      /* Fujitsu VPP500 */
                    219: #define EM_SPARC32PLUS 18      /* Enhanced instruction set SPARC */
                    220: #define EM_960         19      /* Intel 80960 */
                    221: #define EM_PPC         20      /* PowerPC */
                    222: #define EM_PPC64       21      /* 64-bit PowerPC */
                    223:                        /* 22-35 - Reserved */
                    224: #define EM_S390                22      /* System/390 XXX reserved */
                    225: #define EM_V800                36      /* NEC V800 */
                    226: #define EM_FR20                37      /* Fujitsu FR20 */
                    227: #define EM_RH32                38      /* TRW RH-32 */
                    228: #define EM_RCE         39      /* Motorola RCE */
                    229: #define EM_ARM         40      /* Advanced RISC Machines ARM */
                    230: #define EM_ALPHA       41      /* DIGITAL Alpha */
                    231: #define EM_SH          42      /* Hitachi Super-H */
                    232: #define EM_SPARCV9     43      /* SPARC Version 9 */
                    233: #define EM_TRICORE     44      /* Siemens Tricore */
                    234: #define EM_ARC         45      /* Argonaut RISC Core */
                    235: #define EM_H8_300      46      /* Hitachi H8/300 */
                    236: #define EM_H8_300H     47      /* Hitachi H8/300H */
                    237: #define EM_H8S         48      /* Hitachi H8S */
                    238: #define EM_H8_500      49      /* Hitachi H8/500 */
                    239: #define EM_IA_64       50      /* Intel Merced Processor */
                    240: #define EM_MIPS_X      51      /* Stanford MIPS-X */
                    241: #define EM_COLDFIRE    52      /* Motorola Coldfire */
                    242: #define EM_68HC12      53      /* Motorola MC68HC12 */
                    243: #define EM_MMA         54      /* Fujitsu MMA Multimedia Accelerator */
                    244: #define EM_PCP         55      /* Siemens PCP */
                    245: #define EM_NCPU                56      /* Sony nCPU embedded RISC processor */
                    246: #define EM_NDR1                57      /* Denso NDR1 microprocessor */
                    247: #define EM_STARCORE    58      /* Motorola Star*Core processor */
                    248: #define EM_ME16                59      /* Toyota ME16 processor */
                    249: #define EM_ST100       60      /* STMicroelectronics ST100 processor */
                    250: #define EM_TINYJ       61      /* Advanced Logic Corp. TinyJ embedded family processor */
                    251: #define EM_X86_64      62      /* AMD x86-64 architecture */
                    252: #define EM_PDSP                63      /* Sony DSP Processor */
                    253: #define EM_PDP10       64      /* Digital Equipment Corp. PDP-10 */
                    254: #define EM_PDP11       65      /* Digital Equipment Corp. PDP-11 */
                    255: #define EM_FX66                66      /* Siemens FX66 microcontroller */
                    256: #define EM_ST9PLUS     67      /* STMicroelectronics ST9+ 8/16 bit microcontroller */
                    257: #define EM_ST7         68      /* STMicroelectronics ST7 8-bit microcontroller */
                    258: #define EM_68HC16      69      /* Motorola MC68HC16 Microcontroller */
                    259: #define EM_68HC11      70      /* Motorola MC68HC11 Microcontroller */
                    260: #define EM_68HC08      71      /* Motorola MC68HC08 Microcontroller */
                    261: #define EM_68HC05      72      /* Motorola MC68HC05 Microcontroller */
                    262: #define EM_SVX         73      /* Silicon Graphics SVx */
                    263: #define EM_ST19                74      /* STMicroelectronics ST19 8-bit CPU */
                    264: #define EM_VAX         75      /* Digital VAX */
                    265: #define EM_CRIS                76      /* Axis Communications 32-bit embedded processor */
                    266: #define EM_JAVELIN     77      /* Infineon Technologies 32-bit embedded CPU */
                    267: #define EM_FIREPATH    78      /* Element 14 64-bit DSP processor */
                    268: #define EM_ZSP         79      /* LSI Logic's 16-bit DSP processor */
                    269: #define EM_MMIX                80      /* Donald Knuth's educational 64-bit processor */
                    270: #define EM_HUANY       81      /* Harvard's machine-independent format */
                    271: #define EM_PRISM       82      /* SiTera Prism */
                    272: #define EM_AVR         83      /* Atmel AVR 8-bit microcontroller */
                    273: #define EM_FR30                84      /* Fujitsu FR30 */
                    274: #define EM_D10V                85      /* Mitsubishi D10V */
                    275: #define EM_D30V                86      /* Mitsubishi D30V */
                    276: #define EM_V850                87      /* NEC v850 */
                    277: #define EM_M32R                88      /* Mitsubishi M32R */
                    278: #define EM_MN10300     89      /* Matsushita MN10300 */
                    279: #define EM_MN10200     90      /* Matsushita MN10200 */
                    280: #define EM_PJ          91      /* picoJava */
                    281: #define EM_OR1K                92      /* OpenRISC 32-bit embedded processor */
                    282: #define EM_OPENRISC    EM_OR1K
                    283: #define EM_ARC_A5      93      /* ARC Cores Tangent-A5 */
                    284: #define EM_XTENSA      94      /* Tensilica Xtensa Architecture */
                    285: #define EM_VIDEOCORE   95      /* Alphamosaic VideoCore processor */
                    286: #define EM_TMM_GPP     96      /* Thompson Multimedia General Purpose Processor */
                    287: #define EM_NS32K       97      /* National Semiconductor 32000 series */
                    288: #define EM_TPC         98      /* Tenor Network TPC processor */
                    289: #define EM_SNP1K       99      /* Trebia SNP 1000 processor */
                    290: #define EM_ST200       100     /* STMicroelectronics ST200 microcontroller */
                    291: #define EM_IP2K                101     /* Ubicom IP2xxx microcontroller family */
                    292: #define EM_MAX         102     /* MAX processor */
                    293: #define EM_CR          103     /* National Semiconductor CompactRISC micorprocessor */
                    294: #define EM_F2MC16      104     /* Fujitsu F2MC16 */
                    295: #define EM_MSP430      105     /* Texas Instruments MSP430 */
                    296: #define EM_BLACKFIN    106     /* Analog Devices Blackfin DSP */
                    297: #define EM_SE_C33      107     /* Seiko Epson S1C33 family */
                    298: #define EM_SEP         108     /* Sharp embedded microprocessor */
                    299: #define EM_ARCA                109     /* Arca RISC microprocessor */
                    300: #define EM_UNICORE     110     /* UNICORE from PKU-Unity Ltd. and MPRC Peking University */
                    301: #define EM_ALTERA_NIOS2        113     /* Altera Nios II soft-core processor */
                    302: #define EM_AARCH64     183     /* AArch64 64-bit ARM microprocessor */
                    303: #define EM_AVR32       185     /* Atmel Corporation 32-bit microprocessor family*/
                    304: #define EM_TILE64      187     /* Tilera TILE64 multicore architecture family */
                    305: #define EM_TILEPRO     188     /* Tilera TILEPro multicore architecture family */
                    306: #define EM_MICROBLAZE  189     /* Xilinx MicroBlaze 32-bit RISC soft processor core */
                    307: #define EM_TILEGX      192     /* Tilera TILE-GX multicore architecture family */
                    308: #define EM_Z80         220     /* Zilog Z80 */
                    309: #define EM_RISCV       243     /* RISC-V */
                    310: 
                    311: /* Unofficial machine types follow */
                    312: #define EM_ALPHA_EXP   36902   /* used by NetBSD/alpha; obsolete */
                    313: #define EM_NUM         36903
                    314: 
                    315: /*
                    316:  * Program Header
                    317:  */
                    318: typedef struct {
                    319:        Elf32_Word      p_type;         /* entry type */
                    320:        Elf32_Off       p_offset;       /* offset */
                    321:        Elf32_Addr      p_vaddr;        /* virtual address */
                    322:        Elf32_Addr      p_paddr;        /* physical address */
                    323:        Elf32_Word      p_filesz;       /* file size */
                    324:        Elf32_Word      p_memsz;        /* memory size */
                    325:        Elf32_Word      p_flags;        /* flags */
                    326:        Elf32_Word      p_align;        /* memory & file alignment */
                    327: } Elf32_Phdr;
                    328: 
                    329: typedef struct {
                    330:        Elf64_Word      p_type;         /* entry type */
                    331:        Elf64_Word      p_flags;        /* flags */
                    332:        Elf64_Off       p_offset;       /* offset */
                    333:        Elf64_Addr      p_vaddr;        /* virtual address */
                    334:        Elf64_Addr      p_paddr;        /* physical address */
                    335:        Elf64_Xword     p_filesz;       /* file size */
                    336:        Elf64_Xword     p_memsz;        /* memory size */
                    337:        Elf64_Xword     p_align;        /* memory & file alignment */
                    338: } Elf64_Phdr;
                    339: 
                    340: /* p_type */
                    341: #define PT_NULL                0               /* Program header table entry unused */
                    342: #define PT_LOAD                1               /* Loadable program segment */
                    343: #define PT_DYNAMIC     2               /* Dynamic linking information */
                    344: #define PT_INTERP      3               /* Program interpreter */
                    345: #define PT_NOTE                4               /* Auxiliary information */
                    346: #define PT_SHLIB       5               /* Reserved, unspecified semantics */
                    347: #define PT_PHDR                6               /* Entry for header table itself */
                    348: #define PT_TLS         7               /* TLS initialisation image */
                    349: #define PT_NUM         8
                    350: 
                    351: #define PT_LOOS                0x60000000      /* OS-specific range */
                    352: 
                    353: /* GNU-specific */
                    354: #define PT_GNU_EH_FRAME 0x6474e550     /* EH frame segment */
                    355: #define PT_GNU_STACK   0x6474e551      /* Indicate executable stack */
                    356: #define PT_GNU_RELRO   0x6474e552      /* Make read-only after relocation */
                    357: 
                    358: #define PT_HIOS                0x6fffffff
                    359: #define PT_LOPROC      0x70000000      /* Processor-specific range */
                    360: #define PT_HIPROC      0x7fffffff
                    361: 
                    362: #define PT_MIPS_REGINFO 0x70000000
                    363: #define PT_MIPS_ABIFLAGS 0x70000003
                    364: 
1.1.1.2 ! root      365: /* From OpenBSD/src/sys/sys/exec_elf.h */
        !           366: #define PT_OPENBSD_RANDOMIZE   0x65a3dbe6      /* fill with random data */
        !           367: #define PT_OPENBSD_WXNEEDED    0x65a3dbe7      /* program performs W^X violations */
        !           368: #define PT_OPENBSD_BOOTDATA    0x65a41be6      /* section for boot arguments */
        !           369: 
        !           370: 
1.1       root      371: /* p_flags */
                    372: #define PF_R           0x4             /* Segment is readable */
                    373: #define PF_W           0x2             /* Segment is writable */
                    374: #define PF_X           0x1             /* Segment is executable */
                    375: 
                    376: #define PF_MASKOS      0x0ff00000      /* Operating system specific values */
                    377: #define PF_MASKPROC    0xf0000000      /* Processor-specific values */
                    378: 
                    379: /* Extended program header index. */
                    380: #define PN_XNUM                0xffff
                    381: 
                    382: /*
                    383:  * Section Headers
                    384:  */
                    385: typedef struct {
                    386:        Elf32_Word      sh_name;        /* section name (.shstrtab index) */
                    387:        Elf32_Word      sh_type;        /* section type */
                    388:        Elf32_Word      sh_flags;       /* section flags */
                    389:        Elf32_Addr      sh_addr;        /* virtual address */
                    390:        Elf32_Off       sh_offset;      /* file offset */
                    391:        Elf32_Word      sh_size;        /* section size */
                    392:        Elf32_Word      sh_link;        /* link to another */
                    393:        Elf32_Word      sh_info;        /* misc info */
                    394:        Elf32_Word      sh_addralign;   /* memory alignment */
                    395:        Elf32_Word      sh_entsize;     /* table entry size */
                    396: } Elf32_Shdr;
                    397: 
                    398: typedef struct {
                    399:        Elf64_Word      sh_name;        /* section name (.shstrtab index) */
                    400:        Elf64_Word      sh_type;        /* section type */
                    401:        Elf64_Xword     sh_flags;       /* section flags */
                    402:        Elf64_Addr      sh_addr;        /* virtual address */
                    403:        Elf64_Off       sh_offset;      /* file offset */
                    404:        Elf64_Xword     sh_size;        /* section size */
                    405:        Elf64_Word      sh_link;        /* link to another */
                    406:        Elf64_Word      sh_info;        /* misc info */
                    407:        Elf64_Xword     sh_addralign;   /* memory alignment */
                    408:        Elf64_Xword     sh_entsize;     /* table entry size */
                    409: } Elf64_Shdr;
                    410: 
                    411: /* sh_type */
                    412: #define SHT_NULL             0         /* Section header table entry unused */
                    413: #define SHT_PROGBITS         1         /* Program information */
                    414: #define SHT_SYMTAB           2         /* Symbol table */
                    415: #define SHT_STRTAB           3         /* String table */
                    416: #define SHT_RELA             4         /* Relocation information w/ addend */
                    417: #define SHT_HASH             5         /* Symbol hash table */
                    418: #define SHT_DYNAMIC          6         /* Dynamic linking information */
                    419: #define SHT_NOTE             7         /* Auxiliary information */
                    420: #define SHT_NOBITS           8         /* No space allocated in file image */
                    421: #define SHT_REL                      9         /* Relocation information w/o addend */
                    422: #define SHT_SHLIB           10         /* Reserved, unspecified semantics */
                    423: #define SHT_DYNSYM          11         /* Symbol table for dynamic linker */
                    424: #define SHT_INIT_ARRAY      14         /* Initialization function pointers */
                    425: #define SHT_FINI_ARRAY      15         /* Termination function pointers */
                    426: #define SHT_PREINIT_ARRAY    16                /* Pre-initialization function ptrs */
                    427: #define SHT_GROUP           17         /* Section group */
                    428: #define SHT_SYMTAB_SHNDX     18                /* Section indexes (see SHN_XINDEX) */
                    429: #define SHT_NUM                     19
                    430: 
                    431: #define SHT_LOOS            0x60000000 /* Operating system specific range */
                    432: #define SHT_GNU_INCREMENTAL_INPUTS 0x6fff4700   /* GNU incremental build data */
                    433: #define        SHT_LOSUNW           0x6ffffff4
                    434: #define        SHT_SUNW_dof         0x6ffffff4
                    435: #define        SHT_GNU_ATTRIBUTES   0x6ffffff5 /* GNU object attributes */
                    436: #define        SHT_SUNW_cap         0x6ffffff5
                    437: #define        SHT_SUNW_SIGNATURE   0x6ffffff6
                    438: #define SHT_GNU_HASH        0x6ffffff6 /* GNU style symbol hash table */
                    439: #define SHT_GNU_LIBLIST             0x6ffffff7 /* GNU list of prelink dependencies */
                    440: #define SHT_SUNW_move       0x6ffffffa
                    441: #define        SHT_SUNW_COMDAT      0x6ffffffb
                    442: #define SHT_SUNW_syminfo     0x6ffffffc
                    443: #define SHT_SUNW_verdef             0x6ffffffd /* Versions defined by file */
                    444: #define SHT_GNU_verdef      SHT_SUNW_verdef
                    445: #define SHT_SUNW_verneed     0x6ffffffe /* Versions needed by file */
                    446: #define SHT_GNU_verneed             SHT_SUNW_verneed
                    447: #define SHT_SUNW_versym             0x6fffffff /* Symbol versions */
                    448: #define SHT_GNU_versym      SHT_SUNW_versym
                    449: #define        SHT_HISUNW           0x6fffffff
                    450: #define SHT_HIOS            0x6fffffff
                    451: #define SHT_LOPROC          0x70000000 /* Processor-specific range */
                    452: #define SHT_AMD64_UNWIND     0x70000001 /* unwind information */
                    453: #define SHT_ARM_EXIDX       0x70000001 /* exception index table */
                    454: #define SHT_ARM_PREEMPTMAP   0x70000002 /* BPABI DLL dynamic linking 
                    455:                                         * pre-emption map */
                    456: #define SHT_ARM_ATTRIBUTES   0x70000003 /* Object file compatibility 
                    457:                                         * attributes */
                    458: #define SHT_ARM_DEBUGOVERLAY 0x70000004 /* See DBGOVL for details */
                    459: #define SHT_ARM_OVERLAYSECTION 0x70000005
                    460: #define        SHT_MIPS_REGINFO     0x70000006
                    461: #define        SHT_MIPS_OPTIONS     0x7000000d
                    462: #define        SHT_MIPS_DWARF       0x7000001e /* MIPS gcc uses MIPS_DWARF */
                    463: #define SHT_HIPROC          0x7fffffff
                    464: #define SHT_LOUSER          0x80000000 /* Application-specific range */
                    465: #define SHT_HIUSER          0xffffffff
                    466: 
                    467: /* sh_flags */
                    468: #define SHF_WRITE           0x00000001 /* Contains writable data */
                    469: #define SHF_ALLOC           0x00000002 /* Occupies memory */
                    470: #define SHF_EXECINSTR       0x00000004 /* Contains executable insns */
                    471: #define SHF_MERGE           0x00000010 /* Might be merged */
                    472: #define SHF_STRINGS         0x00000020 /* Contains nul terminated strings */
                    473: #define SHF_INFO_LINK       0x00000040 /* "sh_info" contains SHT index */
                    474: #define SHF_LINK_ORDER      0x00000080 /* Preserve order after combining */
                    475: #define SHF_OS_NONCONFORMING 0x00000100 /* OS specific handling required */
                    476: #define SHF_GROUP           0x00000200 /* Is member of a group */
                    477: #define SHF_TLS                     0x00000400 /* Holds thread-local data */
                    478: #define SHF_MASKOS          0x0ff00000 /* Operating system specific values */
                    479: #define SHF_MASKPROC        0xf0000000 /* Processor-specific values */
                    480: #define SHF_ORDERED         0x40000000 /* Ordering requirement (Solaris) */
                    481: #define SHF_EXCLUDE         0x80000000 /* Excluded unless unles ref/alloc
                    482:                                           (Solaris).*/
                    483: /*
                    484:  * Symbol Table
                    485:  */
                    486: typedef struct {
                    487:        Elf32_Word      st_name;        /* Symbol name (.strtab index) */
                    488:        Elf32_Word      st_value;       /* value of symbol */
                    489:        Elf32_Word      st_size;        /* size of symbol */
                    490:        Elf_Byte        st_info;        /* type / binding attrs */
                    491:        Elf_Byte        st_other;       /* unused */
                    492:        Elf32_Half      st_shndx;       /* section index of symbol */
                    493: } Elf32_Sym;
                    494: 
                    495: typedef struct {
                    496:        Elf64_Word      st_name;        /* Symbol name (.strtab index) */
                    497:        Elf_Byte        st_info;        /* type / binding attrs */
                    498:        Elf_Byte        st_other;       /* unused */
                    499:        Elf64_Half      st_shndx;       /* section index of symbol */
                    500:        Elf64_Addr      st_value;       /* value of symbol */
                    501:        Elf64_Xword     st_size;        /* size of symbol */
                    502: } Elf64_Sym;
                    503: 
                    504: /* Symbol Table index of the undefined symbol */
                    505: #define ELF_SYM_UNDEFINED      0
                    506: 
                    507: #define STN_UNDEF              0       /* undefined index */
                    508: 
                    509: /* st_info: Symbol Bindings */
                    510: #define STB_LOCAL              0       /* local symbol */
                    511: #define STB_GLOBAL             1       /* global symbol */
                    512: #define STB_WEAK               2       /* weakly defined global symbol */
                    513: #define STB_NUM                        3
                    514: 
                    515: #define STB_LOOS               10      /* Operating system specific range */
                    516: #define STB_HIOS               12
                    517: #define STB_LOPROC             13      /* Processor-specific range */
                    518: #define STB_HIPROC             15
                    519: 
                    520: /* st_info: Symbol Types */
                    521: #define STT_NOTYPE             0       /* Type not specified */
                    522: #define STT_OBJECT             1       /* Associated with a data object */
                    523: #define STT_FUNC               2       /* Associated with a function */
                    524: #define STT_SECTION            3       /* Associated with a section */
                    525: #define STT_FILE               4       /* Associated with a file name */
                    526: #define STT_COMMON             5       /* Uninitialised common block */
                    527: #define STT_TLS                        6       /* Thread local data object */
                    528: #define STT_NUM                        7
                    529: 
                    530: #define STT_LOOS               10      /* Operating system specific range */
                    531: #define STT_GNU_IFUNC          10      /* GNU extension: indirect function */
                    532: #define STT_HIOS               12
                    533: #define STT_LOPROC             13      /* Processor-specific range */
                    534: #define STT_HIPROC             15
                    535: 
                    536: /* st_other: Visibility Types */
                    537: #define STV_DEFAULT            0       /* use binding type */
                    538: #define STV_INTERNAL           1       /* not referenced from outside */
                    539: #define STV_HIDDEN             2       /* not visible, may be used via ptr */
                    540: #define STV_PROTECTED          3       /* visible, not preemptible */
                    541: #define STV_EXPORTED           4
                    542: #define STV_SINGLETON          5
                    543: #define STV_ELIMINATE          6
                    544: 
                    545: /* st_info/st_other utility macros */
                    546: #define ELF_ST_BIND(info)              ((uint32_t)(info) >> 4)
                    547: #define ELF_ST_TYPE(info)              ((uint32_t)(info) & 0xf)
                    548: #define ELF_ST_INFO(bind,type)         ((Elf_Byte)(((bind) << 4) | \
                    549:                                         ((type) & 0xf)))
                    550: #define ELF_ST_VISIBILITY(other)       ((uint32_t)(other) & 3)
                    551: 
                    552: /*
                    553:  * Special section indexes
                    554:  */
                    555: #define SHN_UNDEF      0               /* Undefined section */
                    556: 
                    557: #define SHN_LORESERVE  0xff00          /* Reserved range */
                    558: #define SHN_ABS                0xfff1          /*  Absolute symbols */
                    559: #define SHN_COMMON     0xfff2          /*  Common symbols */
                    560: #define SHN_XINDEX     0xffff          /* Escape -- index stored elsewhere */
                    561: #define SHN_HIRESERVE  0xffff
                    562: 
                    563: #define SHN_LOPROC     0xff00          /* Processor-specific range */
                    564: #define SHN_HIPROC     0xff1f
                    565: #define SHN_LOOS       0xff20          /* Operating system specific range */
                    566: #define SHN_HIOS       0xff3f
                    567: 
                    568: #define SHN_MIPS_ACOMMON 0xff00
                    569: #define SHN_MIPS_TEXT  0xff01
                    570: #define SHN_MIPS_DATA  0xff02
                    571: #define SHN_MIPS_SCOMMON 0xff03
                    572: 
                    573: /*
                    574:  * Relocation Entries
                    575:  */
                    576: typedef struct {
                    577:        Elf32_Word      r_offset;       /* where to do it */
                    578:        Elf32_Word      r_info;         /* index & type of relocation */
                    579: } Elf32_Rel;
                    580: 
                    581: typedef struct {
                    582:        Elf32_Word      r_offset;       /* where to do it */
                    583:        Elf32_Word      r_info;         /* index & type of relocation */
                    584:        Elf32_Sword     r_addend;       /* adjustment value */
                    585: } Elf32_Rela;
                    586: 
                    587: /* r_info utility macros */
                    588: #define ELF32_R_SYM(info)      ((info) >> 8)
                    589: #define ELF32_R_TYPE(info)     ((info) & 0xff)
                    590: #define ELF32_R_INFO(sym, type) (((sym) << 8) + (unsigned char)(type))
                    591: 
                    592: typedef struct {
                    593:        Elf64_Addr      r_offset;       /* where to do it */
                    594:        Elf64_Xword     r_info;         /* index & type of relocation */
                    595: } Elf64_Rel;
                    596: 
                    597: typedef struct {
                    598:        Elf64_Addr      r_offset;       /* where to do it */
                    599:        Elf64_Xword     r_info;         /* index & type of relocation */
                    600:        Elf64_Sxword    r_addend;       /* adjustment value */
                    601: } Elf64_Rela;
                    602: 
                    603: /* r_info utility macros */
                    604: #define ELF64_R_SYM(info)      ((info) >> 32)
                    605: #define ELF64_R_TYPE(info)     ((info) & 0xffffffff)
                    606: #define ELF64_R_INFO(sym,type) (((sym) << 32) + (type))
                    607: 
                    608: /*
                    609:  * Move entries
                    610:  */
                    611: typedef struct {
                    612:        Elf32_Lword     m_value;        /* symbol value */
                    613:        Elf32_Word      m_info;         /* size + index */
                    614:        Elf32_Word      m_poffset;      /* symbol offset */
                    615:        Elf32_Half      m_repeat;       /* repeat count */
                    616:        Elf32_Half      m_stride;       /* stride info */
                    617: } Elf32_Move;
                    618: 
                    619: #define ELF32_M_SYM(info)      ((info) >> 8)
                    620: #define ELF32_M_SIZE(info)     ((info) & 0xff)
                    621: #define ELF32_M_INFO(sym, size) (((sym) << 8) + (unsigned char)(size))
                    622: 
                    623: typedef struct {
                    624:        Elf64_Lword     m_value;        /* symbol value */
                    625:        Elf64_Xword     m_info;         /* size + index */
                    626:        Elf64_Xword     m_poffset;      /* symbol offset */
                    627:        Elf64_Word      m_repeat;       /* repeat count */
                    628:        Elf64_Word      m_stride;       /* stride info */
                    629: } Elf64_Move;
                    630: 
                    631: #define ELF64_M_SYM(info)      ((info) >> 8)
                    632: #define ELF64_M_SIZE(info)     ((info) & 0xff)
                    633: #define ELF64_M_INFO(sym, size) (((sym) << 8) + (unsigned char)(size))
                    634: 
                    635: /*
                    636:  * Hardware/software capabilities entry
                    637:  */
                    638: typedef struct {
                    639:        Elf32_Word              c_tag;  /* entry tag value */
                    640:        union {
                    641:                Elf32_Addr      c_ptr;
                    642:                Elf32_Word      c_val;
                    643:        } c_un;
                    644: } Elf32_Cap;
                    645: 
                    646: typedef struct {
                    647:        Elf64_Xword             c_tag;  /* entry tag value */
                    648:        union {
                    649:                Elf64_Addr      c_ptr;
                    650:                Elf64_Xword     c_val;
                    651:        } c_un;
                    652: } Elf64_Cap;
                    653: 
                    654: /*
                    655:  * Dynamic Section structure array
                    656:  */
                    657: typedef struct {
                    658:        Elf32_Word              d_tag;  /* entry tag value */
                    659:        union {
                    660:                Elf32_Addr      d_ptr;
                    661:                Elf32_Word      d_val;
                    662:        } d_un;
                    663: } Elf32_Dyn;
                    664: 
                    665: typedef struct {
                    666:        Elf64_Xword             d_tag;  /* entry tag value */
                    667:        union {
                    668:                Elf64_Addr      d_ptr;
                    669:                Elf64_Xword     d_val;
                    670:        } d_un;
                    671: } Elf64_Dyn;
                    672: 
                    673: /* d_tag */
                    674: #define DT_NULL                0       /* Marks end of dynamic array */
                    675: #define DT_NEEDED      1       /* Name of needed library (DT_STRTAB offset) */
                    676: #define DT_PLTRELSZ    2       /* Size, in bytes, of relocations in PLT */
                    677: #define DT_PLTGOT      3       /* Address of PLT and/or GOT */
                    678: #define DT_HASH                4       /* Address of symbol hash table */
                    679: #define DT_STRTAB      5       /* Address of string table */
                    680: #define DT_SYMTAB      6       /* Address of symbol table */
                    681: #define DT_RELA                7       /* Address of Rela relocation table */
                    682: #define DT_RELASZ      8       /* Size, in bytes, of DT_RELA table */
                    683: #define DT_RELAENT     9       /* Size, in bytes, of one DT_RELA entry */
                    684: #define DT_STRSZ       10      /* Size, in bytes, of DT_STRTAB table */
                    685: #define DT_SYMENT      11      /* Size, in bytes, of one DT_SYMTAB entry */
                    686: #define DT_INIT                12      /* Address of initialization function */
                    687: #define DT_FINI                13      /* Address of termination function */
                    688: #define DT_SONAME      14      /* Shared object name (DT_STRTAB offset) */
                    689: #define DT_RPATH       15      /* Library search path (DT_STRTAB offset) */
                    690: #define DT_SYMBOLIC    16      /* Start symbol search within local object */
                    691: #define DT_REL         17      /* Address of Rel relocation table */
                    692: #define DT_RELSZ       18      /* Size, in bytes, of DT_REL table */
                    693: #define DT_RELENT      19      /* Size, in bytes, of one DT_REL entry */
                    694: #define DT_PLTREL      20      /* Type of PLT relocation entries */
                    695: #define DT_DEBUG       21      /* Used for debugging; unspecified */
                    696: #define DT_TEXTREL     22      /* Relocations might modify non-writable seg */
                    697: #define DT_JMPREL      23      /* Address of relocations associated with PLT */
                    698: #define DT_BIND_NOW    24      /* Process all relocations at load-time */
                    699: #define DT_INIT_ARRAY  25      /* Address of initialization function array */
                    700: #define DT_FINI_ARRAY  26      /* Size, in bytes, of DT_INIT_ARRAY array */
                    701: #define DT_INIT_ARRAYSZ 27     /* Address of termination function array */
                    702: #define DT_FINI_ARRAYSZ 28     /* Size, in bytes, of DT_FINI_ARRAY array*/
                    703: #define DT_RUNPATH     29      /* overrides DT_RPATH */
                    704: #define DT_FLAGS       30      /* Encodes ORIGIN, SYMBOLIC, TEXTREL, BIND_NOW, STATIC_TLS */
                    705: #define DT_ENCODING    31      /* ??? */
                    706: #define DT_PREINIT_ARRAY 32    /* Address of pre-init function array */
                    707: #define DT_PREINIT_ARRAYSZ 33  /* Size, in bytes, of DT_PREINIT_ARRAY array */
                    708: #define DT_NUM         34
                    709: 
                    710: #define DT_LOOS                0x60000000      /* Operating system specific range */
                    711: #define DT_VERSYM      0x6ffffff0      /* Symbol versions */
                    712: #define DT_FLAGS_1     0x6ffffffb      /* ELF dynamic flags */
                    713: #define DT_VERDEF      0x6ffffffc      /* Versions defined by file */
                    714: #define DT_VERDEFNUM   0x6ffffffd      /* Number of versions defined by file */
                    715: #define DT_VERNEED     0x6ffffffe      /* Versions needed by file */
                    716: #define DT_VERNEEDNUM  0x6fffffff      /* Number of versions needed by file */
                    717: #define DT_HIOS                0x6fffffff
                    718: #define DT_LOPROC      0x70000000      /* Processor-specific range */
                    719: #define DT_HIPROC      0x7fffffff
                    720: 
                    721: /* Flag values for DT_FLAGS */
                    722: #define DF_ORIGIN      0x00000001      /* uses $ORIGIN */
                    723: #define DF_SYMBOLIC    0x00000002      /* */
                    724: #define DF_TEXTREL     0x00000004      /* */
                    725: #define DF_BIND_NOW    0x00000008      /* */
                    726: #define DF_STATIC_TLS  0x00000010      /* */
                    727: 
                    728: /* Flag values for DT_FLAGS_1 */
                    729: #define        DF_1_NOW        0x00000001      /* Same as DF_BIND_NOW */
                    730: #define        DF_1_GLOBAL     0x00000002      /* Unused */
                    731: #define        DF_1_GROUP      0x00000004      /* Is member of group */
                    732: #define        DF_1_NODELETE   0x00000008      /* Cannot be deleted from process */
                    733: #define        DF_1_LOADFLTR   0x00000010      /* Immediate loading of filters */
                    734: #define        DF_1_INITFIRST  0x00000020      /* init/fini takes priority */
                    735: #define        DF_1_NOOPEN     0x00000040      /* Do not allow loading on dlopen() */
                    736: #define        DF_1_ORIGIN     0x00000080      /* Require $ORIGIN processing */
                    737: #define        DF_1_DIRECT     0x00000100      /* Enable direct bindings */
                    738: #define        DF_1_INTERPOSE  0x00000400      /* Is an interposer */
                    739: #define        DF_1_NODEFLIB   0x00000800      /* Ignore default library search path */
                    740: #define        DF_1_NODUMP     0x00001000      /* Cannot be dumped with dldump(3C) */
                    741: #define        DF_1_CONFALT    0x00002000      /* Configuration alternative */
                    742: #define        DF_1_ENDFILTEE  0x00004000      /* Filtee ends filter's search */
                    743: #define        DF_1_DISPRELDNE 0x00008000      /* Did displacement relocation */
                    744: #define        DF_1_DISPRELPND 0x00010000      /* Pending displacement relocation */
                    745: #define        DF_1_NODIRECT   0x00020000      /* Has non-direct bindings */
                    746: #define        DF_1_IGNMULDEF  0x00040000      /* Used internally */
                    747: #define        DF_1_NOKSYMS    0x00080000      /* Used internally */
                    748: #define        DF_1_NOHDR      0x00100000      /* Used internally */
                    749: #define        DF_1_EDITED     0x00200000      /* Has been modified since build */
                    750: #define        DF_1_NORELOC    0x00400000      /* Used internally */
                    751: #define        DF_1_SYMINTPOSE 0x00800000      /* Has individual symbol interposers */
                    752: #define        DF_1_GLOBAUDIT  0x01000000      /* Require global auditing */
                    753: #define        DF_1_SINGLETON  0x02000000      /* Has singleton symbols */
                    754: #define        DF_1_STUB       0x04000000      /* Stub */
                    755: #define        DF_1_PIE        0x08000000      /* Position Independent Executable */
                    756: 
                    757: /*
                    758:  * Auxiliary Vectors
                    759:  */
                    760: typedef struct {
                    761:        Elf32_Word      a_type;                         /* 32-bit id */
                    762:        Elf32_Word      a_v;                            /* 32-bit id */
                    763: } Aux32Info;
                    764: 
                    765: typedef struct {
                    766:        Elf64_Word      a_type;         /* 32-bit id */
                    767:        Elf64_Xword     a_v;            /* 64-bit id */
                    768: } Aux64Info;
                    769: 
                    770: /* a_type */
                    771: #define AT_NULL                0       /* Marks end of array */
                    772: #define AT_IGNORE      1       /* No meaning, a_un is undefined */
                    773: #define AT_EXECFD      2       /* Open file descriptor of object file */
                    774: #define AT_PHDR                3       /* &phdr[0] */
                    775: #define AT_PHENT       4       /* sizeof(phdr[0]) */
                    776: #define AT_PHNUM       5       /* # phdr entries */
                    777: #define AT_PAGESZ      6       /* PAGESIZE */
                    778: #define AT_BASE                7       /* Interpreter base addr */
                    779: #define AT_FLAGS       8       /* Processor flags */
                    780: #define AT_ENTRY       9       /* Entry address of executable */
                    781: #define AT_DCACHEBSIZE 10      /* Data cache block size */
                    782: #define AT_ICACHEBSIZE 11      /* Instruction cache block size */
                    783: #define AT_UCACHEBSIZE 12      /* Unified cache block size */
                    784: #define AT_STACKBASE   13      /* Base address of the main thread */
                    785: 
                    786:        /* Vendor specific */
                    787: #define AT_MIPS_NOTELF 10      /* XXX a_val != 0 -> MIPS XCOFF executable */
                    788: 
                    789: #define AT_EUID                2000    /* euid (solaris compatible numbers) */
                    790: #define AT_RUID                2001    /* ruid (solaris compatible numbers) */
                    791: #define AT_EGID                2002    /* egid (solaris compatible numbers) */
                    792: #define AT_RGID                2003    /* rgid (solaris compatible numbers) */
                    793: 
                    794:        /* Solaris kernel specific */
                    795: #define AT_SUN_LDELF   2004    /* dynamic linker's ELF header */
                    796: #define AT_SUN_LDSHDR  2005    /* dynamic linker's section header */
                    797: #define AT_SUN_LDNAME  2006    /* dynamic linker's name */
                    798: #define AT_SUN_LPGSIZE 2007    /* large pagesize */
                    799: 
                    800:        /* Other information */
                    801: #define AT_SUN_PLATFORM 2008   /* sysinfo(SI_PLATFORM) */
                    802: #define AT_SUN_HWCAP   2009    /* process hardware capabilities */
                    803: #define AT_SUN_IFLUSH  2010    /* do we need to flush the instruction cache? */
                    804: #define AT_SUN_CPU     2011    /* CPU name */
                    805:        /* ibcs2 emulation band aid */
                    806: #define AT_SUN_EMUL_ENTRY 2012 /* coff entry point */
                    807: #define AT_SUN_EMUL_EXECFD 2013 /* coff file descriptor */
                    808:        /* Executable's fully resolved name */
                    809: #define AT_SUN_EXECNAME 2014
                    810: 
                    811: /*
                    812:  * The header for GNU-style hash sections.
                    813:  */
                    814: typedef struct {
                    815:        uint32_t        gh_nbuckets;    /* Number of hash buckets. */
                    816:        uint32_t        gh_symndx;      /* First visible symbol in .dynsym. */
                    817:        uint32_t        gh_maskwords;   /* #maskwords used in bloom filter. */
                    818:        uint32_t        gh_shift2;      /* Bloom filter shift count. */
                    819: } Elf_GNU_Hash_Header;
                    820: 
                    821: /*
                    822:  * Note Headers
                    823:  */
                    824: typedef struct {
                    825:        Elf32_Word n_namesz;
                    826:        Elf32_Word n_descsz;
                    827:        Elf32_Word n_type;
                    828: } Elf32_Nhdr;
                    829: 
                    830: typedef struct {
                    831:        Elf64_Word n_namesz;
                    832:        Elf64_Word n_descsz;
                    833:        Elf64_Word n_type;
                    834: } Elf64_Nhdr;
                    835: 
                    836: #define ELF_NOTE_GNU_NAMESZ            4
                    837: #define ELF_NOTE_GNU_NAME              "GNU\0"
                    838: 
                    839: /*
                    840:  * GNU-specific note type: ABI tag
                    841:  * name: GNU\0
                    842:  * namesz: 4
                    843:  * desc:
                    844:  *     word[0]: OS tag
                    845:  *     word[1]: major version
                    846:  *     word[2]: minor version
                    847:  *     word[3]: teeny version
                    848:  * descsz: 16
                    849:  */
                    850: /* GNU-specific note name and description sizes */
                    851: #define ELF_NOTE_TYPE_ABI_TAG          1
                    852: #define ELF_NOTE_ABI_NAME              ELF_NOTE_GNU_NAME
                    853: #define ELF_NOTE_ABI_NAMESZ            ELF_NOTE_GNU_NAMESZ
                    854: #define ELF_NOTE_ABI_DESCSZ            16
                    855: /* GNU-specific OS/version value stuff */
                    856: #define ELF_NOTE_ABI_OS_LINUX          0
                    857: #define ELF_NOTE_ABI_OS_HURD           1
                    858: #define ELF_NOTE_ABI_OS_SOLARIS                2
                    859: #define ELF_NOTE_ABI_OS_KFREEBSD       3
                    860: #define ELF_NOTE_ABI_OS_KNETBSD                4
                    861: 
                    862: /* Old gcc style, under the ABI tag */
                    863: #define ELF_NOTE_OGCC_NAMESZ           8
                    864: #define ELF_NOTE_OGCC_NAME             "01.01\0\0\0\0"
                    865: #define ELF_NOTE_OGCC_DESCSZ           0
                    866: 
                    867: /*
                    868:  * GNU-specific note type: Hardware capabilities
                    869:  * name: GNU\0
                    870:  * namesz: 4
                    871:  * desc:
                    872:  *     word[0]: Number of entries
                    873:  *     word[1]: Bitmask of enabled entries
                    874:  *     Followed by a byte id, and a NUL terminated string per entry
                    875:  * descsz: variable
                    876:  */
                    877: #define ELF_NOTE_TYPE_GNU_HWCAP                2
                    878: 
                    879: /*
                    880:  * GNU-specific note type: Build ID generated by ld
                    881:  * name: GNU\0
                    882:  * desc:
                    883:  *     word[0..4] SHA1 [default] 
                    884:  * or
                    885:  *     word[0..3] md5 or uuid
                    886:  * descsz: 16 or 20
                    887:  */
                    888: #define ELF_NOTE_TYPE_GNU_BUILD_ID     3
                    889: 
                    890: /* SuSE-specific note type: ABI
                    891:  * name: SuSE\0
                    892:  * namesz: 5
                    893:  * desc:
                    894:  *     half[0] = MMmm
                    895:  *
                    896:  *     M = product major version
                    897:  *     m = product minor version
                    898:  * descsz: 2
                    899:  */
                    900: #define ELF_NOTE_TYPE_SUSE_TAG 1
                    901: /* SuSE-specific note name and description sizes */
                    902: #define ELF_NOTE_SUSE_NAMESZ   5
                    903: #define ELF_NOTE_SUSE_DESCSZ   2
                    904: /* SuSE-specific note name */
                    905: #define ELF_NOTE_SUSE_NAME             "SuSE\0"
                    906: 
                    907: /* SuSE-specific note type: version
                    908:  * name: SuSE\0\0\0\0
                    909:  * namesz: 8
                    910:  * desc: 
                    911:  *     word[0] = VVTTMMmm
                    912:  *
                    913:  *     V = version of following data
                    914:  *     T = product type: [box, sles, nld, whatever]
                    915:  *     M = product major version
                    916:  *     m = product minor version
                    917:  * descsz: 8
                    918:  */
                    919: #define ELF_NOTE_TYPE_SUSE_VERSION_TAG 0x45537553      /* SuSE in LE */
                    920: /* SuSE-specific note name and description sizes */
                    921: #define ELF_NOTE_SUSE_VERSION_NAMESZ   8
                    922: #define ELF_NOTE_SUSE_VERSION_DESCSZ   8
                    923: /* SuSE-specific note name */
                    924: #define ELF_NOTE_SUSE_VERSION_NAME             "SuSE\0\0\0\0"
                    925: 
                    926: /* Go-specific note type: buildid
                    927:  * name: Go\0\0
                    928:  * namesz: 4
                    929:  * desc: 
                    930:  *     words[10]
                    931:  * descsz: 40
                    932:  */
                    933: #define ELF_NOTE_TYPE_GO_BUILDID_TAG   4
                    934: #define ELF_NOTE_GO_BUILDID_NAMESZ     4
                    935: #define ELF_NOTE_GO_BUILDID_DESCSZ     40
                    936: #define ELF_NOTE_GO_BUILDID_NAME       "Go\0\0"
                    937: 
                    938: /* NetBSD-specific note type: NetBSD ABI version.
                    939:  * name: NetBSD\0\0
                    940:  * namesz: 8
                    941:  * desc: 
                    942:  *     word[0]: MMmmrrpp00
                    943:  *
                    944:  *     M = major version
                    945:  *     m = minor version
                    946:  *     r = release ["",A-Z,Z[A-Z] but numeric]
                    947:  *     p = patchlevel
                    948:  * descsz: 4
                    949:  */
                    950: #define ELF_NOTE_TYPE_NETBSD_TAG       1
                    951: /* NetBSD-specific note name and description sizes */
                    952: #define ELF_NOTE_NETBSD_NAMESZ         7
                    953: #define ELF_NOTE_NETBSD_DESCSZ         4
                    954: /* NetBSD-specific note name */
                    955: #define ELF_NOTE_NETBSD_NAME           "NetBSD\0\0"
                    956: 
                    957: /* NetBSD-specific note type: Emulation (obsolete; last used early 2000)
                    958:  * name: NetBSD\0\0
                    959:  * namesz: 8
                    960:  * desc:
                    961:  *     "netbsd\0"
                    962:  *     
                    963:  * descsz: 8
                    964:  */
                    965: #define ELF_NOTE_TYPE_NETBSD_EMUL_TAG  2
                    966: #define ELF_NOTE_NETBSD_EMUL_NAMESZ    7
                    967: #define ELF_NOTE_NETBSD_EMUL_DESCSZ    7
                    968: /* NetBSD-specific note name */
                    969: #define ELF_NOTE_NETBSD_EMUL_NAME      "NetBSD\0\0"
                    970: 
                    971: /*
                    972:  * NetBSD-specific note type: PaX.
                    973:  * There should be 1 NOTE per executable.
                    974:  * name: PaX\0
                    975:  * namesz: 4
                    976:  * desc:
                    977:  *     word[0]: capability bitmask
                    978:  * descsz: 4
                    979:  */
                    980: #define ELF_NOTE_TYPE_PAX_TAG          3
                    981: #define ELF_NOTE_PAX_MPROTECT          0x01    /* Force enable Mprotect */
                    982: #define ELF_NOTE_PAX_NOMPROTECT                0x02    /* Force disable Mprotect */
                    983: #define ELF_NOTE_PAX_GUARD             0x04    /* Force enable Segvguard */
                    984: #define ELF_NOTE_PAX_NOGUARD           0x08    /* Force disable Segvguard */
                    985: #define ELF_NOTE_PAX_ASLR              0x10    /* Force enable ASLR */
                    986: #define ELF_NOTE_PAX_NOASLR            0x20    /* Force disable ASLR */
                    987: #define ELF_NOTE_PAX_NAMESZ            4
                    988: #define ELF_NOTE_PAX_NAME              "PaX\0"
                    989: #define ELF_NOTE_PAX_DESCSZ            4
                    990: 
                    991: /*
                    992:  * NetBSD-specific core file information.
                    993:  *
                    994:  * NetBSD ELF core files use notes to provide information about
                    995:  * the process's state.         The note name is "NetBSD-CORE" for
                    996:  * information that is global to the process, and "NetBSD-CORE@nn",
                    997:  * where "nn" is the lwpid of the LWP that the information belongs
                    998:  * to (such as register state).
                    999:  *
                   1000:  * We use the following note identifiers:
                   1001:  *
                   1002:  *     ELF_NOTE_NETBSD_CORE_PROCINFO
                   1003:  *             Note is a "netbsd_elfcore_procinfo" structure.
                   1004:  *     ELF_NOTE_NETBSD_CORE_AUXV
                   1005:  *             Note is an array of AuxInfo structures.
                   1006:  *
                   1007:  * We also use ptrace(2) request numbers (the ones that exist in
                   1008:  * machine-dependent space) to identify register info notes.  The
                   1009:  * info in such notes is in the same format that ptrace(2) would
                   1010:  * export that information.
                   1011:  *
                   1012:  * Please try to keep the members of this structure nicely aligned,
                   1013:  * and if you add elements, add them to the end and bump the version.
                   1014:  */
                   1015: 
                   1016: #define ELF_NOTE_NETBSD_CORE_NAME      "NetBSD-CORE"
                   1017: 
                   1018: #define ELF_NOTE_NETBSD_CORE_PROCINFO  1
                   1019: #define ELF_NOTE_NETBSD_CORE_AUXV      2
                   1020: 
                   1021: #define NETBSD_ELFCORE_PROCINFO_VERSION 1
                   1022: 
                   1023: struct netbsd_elfcore_procinfo {
                   1024:        /* Version 1 fields start here. */
                   1025:        uint32_t        cpi_version;            /* our version */
                   1026:        uint32_t        cpi_cpisize;            /* sizeof(this struct) */
                   1027:        uint32_t        cpi_signo;              /* killing signal */
                   1028:        uint32_t        cpi_sigcode;            /* signal code */
                   1029:        uint32_t        cpi_sigpend[4];         /* pending signals */
                   1030:        uint32_t        cpi_sigmask[4];         /* blocked signals */
                   1031:        uint32_t        cpi_sigignore[4];       /* ignored signals */
                   1032:        uint32_t        cpi_sigcatch[4];        /* caught signals */
                   1033:        int32_t         cpi_pid;                /* process ID */
                   1034:        int32_t         cpi_ppid;               /* parent process ID */
                   1035:        int32_t         cpi_pgrp;               /* process group ID */
                   1036:        int32_t         cpi_sid;                /* session ID */
                   1037:        uint32_t        cpi_ruid;               /* real user ID */
                   1038:        uint32_t        cpi_euid;               /* effective user ID */
                   1039:        uint32_t        cpi_svuid;              /* saved user ID */
                   1040:        uint32_t        cpi_rgid;               /* real group ID */
                   1041:        uint32_t        cpi_egid;               /* effective group ID */
                   1042:        uint32_t        cpi_svgid;              /* saved group ID */
                   1043:        uint32_t        cpi_nlwps;              /* number of LWPs */
                   1044:        int8_t          cpi_name[32];           /* copy of p->p_comm */
                   1045:        /* Add version 2 fields below here. */
                   1046:        int32_t         cpi_siglwp;     /* LWP target of killing signal */
                   1047: };
                   1048: 
                   1049: /*
                   1050:  * NetBSD-specific note type: MACHINE_ARCH.
                   1051:  * There should be 1 NOTE per executable.
                   1052:  * name:       NetBSD\0
                   1053:  * namesz:     7
                   1054:  * desc:       string
                   1055:  * descsz:     variable
                   1056:  */
                   1057: #define ELF_NOTE_TYPE_MARCH_TAG                5
                   1058: /* NetBSD-specific note name and description sizes */
                   1059: #define ELF_NOTE_MARCH_NAMESZ          ELF_NOTE_NETBSD_NAMESZ
                   1060: /* NetBSD-specific note name */
                   1061: #define ELF_NOTE_MARCH_NAME            ELF_NOTE_NETBSD_NAME
                   1062: 
                   1063: /*
                   1064:  * NetBSD-specific note type: MCMODEL
                   1065:  * There should be 1 NOTE per executable.
                   1066:  * name:       NetBSD\0
                   1067:  * namesz:     7
                   1068:  * code model: string
                   1069:  */
                   1070: 
                   1071: #define ELF_NOTE_TYPE_MCMODEL_TAG      6
                   1072: /* NetBSD-specific note name and description sizes */
                   1073: #define ELF_NOTE_MCMODEL_NAMESZ                ELF_NOTE_NETBSD_NAMESZ
                   1074: /* NetBSD-specific note name */
                   1075: #define ELF_NOTE_MCMODEL_NAME          ELF_NOTE_NETBSD_NAME
                   1076: 
                   1077: 
                   1078: #if !defined(ELFSIZE)
                   1079: # if defined(_RUMPKERNEL) || !defined(_KERNEL)
                   1080: #  define ELFSIZE ARCH_ELFSIZE
                   1081: # else
                   1082: #  define ELFSIZE KERN_ELFSIZE
                   1083: # endif
                   1084: #endif
                   1085: 
                   1086: #if defined(ELFSIZE)
                   1087: #define CONCAT(x,y)    __CONCAT(x,y)
                   1088: #define ELFNAME(x)     CONCAT(elf,CONCAT(ELFSIZE,CONCAT(_,x)))
                   1089: #define ELFNAME2(x,y)  CONCAT(x,CONCAT(_elf,CONCAT(ELFSIZE,CONCAT(_,y))))
                   1090: #define ELFNAMEEND(x)  CONCAT(x,CONCAT(_elf,ELFSIZE))
                   1091: #define ELFDEFNNAME(x) CONCAT(ELF,CONCAT(ELFSIZE,CONCAT(_,x)))
                   1092: #define        ElfW(x)         CONCAT(Elf,CONCAT(ELFSIZE,CONCAT(_,x)))
                   1093: #endif
                   1094: 
                   1095: #if defined(ELFSIZE) && (ELFSIZE == 32)
                   1096: #define Elf_Ehdr       Elf32_Ehdr
                   1097: #define Elf_Phdr       Elf32_Phdr
                   1098: #define Elf_Shdr       Elf32_Shdr
                   1099: #define Elf_Sym                Elf32_Sym
                   1100: #define Elf_Rel                Elf32_Rel
                   1101: #define Elf_Rela       Elf32_Rela
                   1102: #define Elf_Dyn                Elf32_Dyn
                   1103: #define Elf_Word       Elf32_Word
                   1104: #define Elf_Sword      Elf32_Sword
                   1105: #define Elf_Half       Elf32_Half
                   1106: #define Elf_Addr       Elf32_Addr
                   1107: #define Elf_Off                Elf32_Off
                   1108: #define Elf_SOff       Elf32_SOff
                   1109: #define Elf_Nhdr       Elf32_Nhdr
                   1110: #define Elf_Verdef     Elf32_Verdef
                   1111: #define Elf_Verdaux    Elf32_Verdaux
                   1112: #define Elf_Verneed    Elf32_Verneed
                   1113: #define Elf_Vernaux    Elf32_Vernaux
                   1114: #define Elf_Versym     Elf32_Versym
                   1115: 
                   1116: #define ELF_R_SYM      ELF32_R_SYM
                   1117: #define ELF_R_TYPE     ELF32_R_TYPE
                   1118: #define ELFCLASS       ELFCLASS32
                   1119: 
                   1120: #define AuxInfo                Aux32Info
                   1121: #elif defined(ELFSIZE) && (ELFSIZE == 64)
                   1122: #define Elf_Ehdr       Elf64_Ehdr
                   1123: #define Elf_Phdr       Elf64_Phdr
                   1124: #define Elf_Shdr       Elf64_Shdr
                   1125: #define Elf_Sym                Elf64_Sym
                   1126: #define Elf_Rel                Elf64_Rel
                   1127: #define Elf_Rela       Elf64_Rela
                   1128: #define Elf_Dyn                Elf64_Dyn
                   1129: #define Elf_Word       Elf64_Word
                   1130: #define Elf_Sword      Elf64_Sword
                   1131: #define Elf_Half       Elf64_Half
                   1132: #define Elf_Addr       Elf64_Addr
                   1133: #define Elf_Off                Elf64_Off
                   1134: #define Elf_SOff       Elf64_SOff
                   1135: #define Elf_Nhdr       Elf64_Nhdr
                   1136: #define Elf_Verdef     Elf64_Verdef
                   1137: #define Elf_Verdaux    Elf64_Verdaux
                   1138: #define Elf_Verneed    Elf64_Verneed
                   1139: #define Elf_Vernaux    Elf64_Vernaux
                   1140: #define Elf_Versym     Elf64_Versym
                   1141: 
                   1142: #define ELF_R_SYM      ELF64_R_SYM
                   1143: #define ELF_R_TYPE     ELF64_R_TYPE
                   1144: #define ELFCLASS       ELFCLASS64
                   1145: 
                   1146: #define AuxInfo                Aux64Info
                   1147: #endif
                   1148: 
                   1149: #ifndef Elf_Symindx
                   1150: #define Elf_Symindx    uint32_t
                   1151: #endif
                   1152: 
                   1153: #define ELF32_ST_BIND(info)            ELF_ST_BIND(info)
                   1154: #define ELF32_ST_TYPE(info)            ELF_ST_TYPE(info)
                   1155: #define ELF32_ST_INFO(bind,type)       ELF_ST_INFO(bind,type)
                   1156: #define ELF32_ST_VISIBILITY(other)     ELF_ST_VISIBILITY(other)
                   1157: 
                   1158: #define ELF64_ST_BIND(info)            ELF_ST_BIND(info)
                   1159: #define ELF64_ST_TYPE(info)            ELF_ST_TYPE(info)
                   1160: #define ELF64_ST_INFO(bind,type)       ELF_ST_INFO(bind,type)
                   1161: #define ELF64_ST_VISIBILITY(other)     ELF_ST_VISIBILITY(other)
                   1162: 
                   1163: typedef struct {
                   1164:        Elf32_Half      si_boundto;     /* direct bindings - symbol bound to */
                   1165:        Elf32_Half      si_flags;       /* per symbol flags */
                   1166: } Elf32_Syminfo;
                   1167: 
                   1168: typedef struct {
                   1169:        Elf64_Word      si_boundto;     /* direct bindings - symbol bound to */
                   1170:        Elf64_Word      si_flags;       /* per symbol flags */
                   1171: } Elf64_Syminfo;
                   1172: 
                   1173: #define SYMINFO_FLG_DIRECT     0x0001  /* symbol ref has direct association
                   1174:                                           to object containing definition */
                   1175: #define SYMINFO_FLG_PASSTHRU   0x0002  /* ignored - see SYMINFO_FLG_FILTER */
                   1176: #define SYMINFO_FLG_COPY       0x0004  /* symbol is a copy-reloc */
                   1177: #define SYMINFO_FLG_LAZYLOAD   0x0008  /* object containing defn should be
                   1178:                                           lazily-loaded */
                   1179: #define SYMINFO_FLG_DIRECTBIND 0x0010  /* ref should be bound directly to
                   1180:                                           object containing definition */
                   1181: #define SYMINFO_FLG_NOEXTDIRECT 0x0020 /* don't let an external reference
                   1182:                                           directly bind to this symbol */
                   1183: #define SYMINFO_FLG_FILTER     0x0002  /* symbol ref is associated to a */
                   1184: #define SYMINFO_FLG_AUXILIARY  0x0040  /*      standard or auxiliary filter */
                   1185: 
                   1186: #define SYMINFO_BT_SELF                0xffff  /* symbol bound to self */
                   1187: #define SYMINFO_BT_PARENT      0xfffe  /* symbol bound to parent */
                   1188: #define SYMINFO_BT_NONE                0xfffd  /* no special symbol binding */
                   1189: #define SYMINFO_BT_EXTERN      0xfffc  /* symbol defined as external */
                   1190: #define SYMINFO_BT_LOWRESERVE  0xff00  /* beginning of reserved entries */
                   1191: 
                   1192: #define SYMINFO_NONE           0       /* Syminfo version */
                   1193: #define SYMINFO_CURRENT                1
                   1194: #define SYMINFO_NUM            2
                   1195: 
                   1196: /*
                   1197:  * These constants are used for Elf32_Verdef struct's version number.  
                   1198:  */
                   1199: #define VER_DEF_NONE           0
                   1200: #define VER_DEF_CURRENT                1
                   1201: 
                   1202: /*
                   1203:  * These constants are used for Elf32_Verdef struct's vd_ndx.
                   1204:  */
                   1205: #define VER_DEF_IDX(x)         VER_NDX(x)
                   1206: 
                   1207: /*
                   1208:  * These constants are used for Elf32_Verdef struct's vd_flags.         
                   1209:  */
                   1210: #define VER_FLG_BASE           0x1
                   1211: #define VER_FLG_WEAK           0x2
                   1212: 
                   1213: /*
                   1214:  * These are used in an Elf32_Versym field.
                   1215:  */
                   1216: #define VER_NDX_LOCAL          0
                   1217: #define VER_NDX_GLOBAL         1
                   1218: #define VER_NDX_GIVEN          2
                   1219: 
                   1220: /*
                   1221:  * These constants are used for Elf32_Verneed struct's version number. 
                   1222:  */
                   1223: #define VER_NEED_NONE          0
                   1224: #define VER_NEED_CURRENT       1
                   1225: 
                   1226: /*
                   1227:  * These constants are used for Elf32_Vernaux struct's vna_other.
                   1228:  */
                   1229: #define VER_NEED_HIDDEN                VER_NDX_HIDDEN
                   1230: #define VER_NEED_IDX(x)                VER_NDX(x)
                   1231: 
                   1232: /* index */
                   1233: #define VER_NDX_HIDDEN         0x8000
                   1234: #define VER_NDX(x)             ((x) & ~VER_NDX_HIDDEN)
                   1235: 
                   1236: /*
                   1237:  * GNU Extension hidding symbol
                   1238:  */
                   1239: #define VERSYM_HIDDEN          0x8000
                   1240: #define VERSYM_VERSION         0x7fff
                   1241: 
                   1242: #define ELF_VER_CHR            '@'
                   1243: 
                   1244: /*
                   1245:  * These are current size independent.
                   1246:  */
                   1247: 
                   1248: typedef struct {
                   1249:        Elf32_Half      vd_version;     /* version number of structure */
                   1250:        Elf32_Half      vd_flags;       /* flags (VER_FLG_*) */
                   1251:        Elf32_Half      vd_ndx;         /* version index */
                   1252:        Elf32_Half      vd_cnt;         /* number of verdaux entries */
                   1253:        Elf32_Word      vd_hash;        /* hash of name */
                   1254:        Elf32_Word      vd_aux;         /* offset to verdaux entries */
                   1255:        Elf32_Word      vd_next;        /* offset to next verdef */
                   1256: } Elf32_Verdef;
                   1257: typedef Elf32_Verdef   Elf64_Verdef;
                   1258: 
                   1259: typedef struct {
                   1260:        Elf32_Word      vda_name;       /* string table offset of name */
                   1261:        Elf32_Word      vda_next;       /* offset to verdaux */
                   1262: } Elf32_Verdaux;
                   1263: typedef Elf32_Verdaux  Elf64_Verdaux;
                   1264: 
                   1265: typedef struct {
                   1266:        Elf32_Half      vn_version;     /* version number of structure */
                   1267:        Elf32_Half      vn_cnt;         /* number of vernaux entries */
                   1268:        Elf32_Word      vn_file;        /* string table offset of library name*/
                   1269:        Elf32_Word      vn_aux;         /* offset to vernaux entries */
                   1270:        Elf32_Word      vn_next;        /* offset to next verneed */
                   1271: } Elf32_Verneed;
                   1272: typedef Elf32_Verneed  Elf64_Verneed;
                   1273: 
                   1274: typedef struct {
                   1275:        Elf32_Word      vna_hash;       /* Hash of dependency name */
                   1276:        Elf32_Half      vna_flags;      /* flags (VER_FLG_*) */
                   1277:        Elf32_Half      vna_other;      /* unused */
                   1278:        Elf32_Word      vna_name;       /* string table offset to version name*/
                   1279:        Elf32_Word      vna_next;       /* offset to next vernaux */
                   1280: } Elf32_Vernaux;
                   1281: typedef Elf32_Vernaux  Elf64_Vernaux;
                   1282: 
                   1283: typedef struct {
                   1284:        Elf32_Half      vs_vers;
                   1285: } Elf32_Versym;
                   1286: typedef Elf32_Versym   Elf64_Versym;
                   1287: 
                   1288: #ifdef _KERNEL
                   1289: 
                   1290: /*
                   1291:  * Arbitrary limits to avoid DoS for excessive memory allocation.
                   1292:  */
                   1293: #define ELF_MAXPHNUM   128
                   1294: #define ELF_MAXSHNUM   32768
                   1295: #define ELF_MAXNOTESIZE        1024
                   1296: 
                   1297: #define ELF_AUX_ENTRIES 15     /* Max size of aux array passed to loader */
                   1298: #define ELF32_NO_ADDR  (~(Elf32_Addr)0) /* Indicates addr. not yet filled in */
                   1299: #define ELF32_LINK_ADDR ((Elf32_Addr)-2) /* advises to use link address */
                   1300: #define ELF64_NO_ADDR  (~(Elf64_Addr)0) /* Indicates addr. not yet filled in */
                   1301: #define ELF64_LINK_ADDR ((Elf64_Addr)-2) /* advises to use link address */
                   1302: 
                   1303: #if defined(ELFSIZE) && (ELFSIZE == 64)
                   1304: #define ELF_NO_ADDR    ELF64_NO_ADDR
                   1305: #define ELF_LINK_ADDR  ELF64_LINK_ADDR
                   1306: #elif defined(ELFSIZE) && (ELFSIZE == 32)
                   1307: #define ELF_NO_ADDR    ELF32_NO_ADDR
                   1308: #define ELF_LINK_ADDR  ELF32_LINK_ADDR
                   1309: #endif
                   1310: 
                   1311: #ifndef ELF32_EHDR_FLAGS_OK
                   1312: #define ELF32_EHDR_FLAGS_OK(eh) 1
                   1313: #endif
                   1314: 
                   1315: #ifndef ELF64_EHDR_FLAGS_OK
                   1316: #define ELF64_EHDR_FLAGS_OK(eh) 1
                   1317: #endif
                   1318: 
                   1319: #if defined(ELFSIZE) && (ELFSIZE == 64)
                   1320: #define ELF_EHDR_FLAGS_OK(eh)  ELF64_EHDR_FLAGS_OK(eh)
                   1321: #else
                   1322: #define ELF_EHDR_FLAGS_OK(eh)  ELF32_EHDR_FLAGS_OK(eh)
                   1323: #endif
                   1324: 
                   1325: #if defined(ELFSIZE)
                   1326: struct elf_args {
                   1327:        Elf_Addr        arg_entry;      /* program entry point */
                   1328:        Elf_Addr        arg_interp;     /* Interpreter load address */
                   1329:        Elf_Addr        arg_phaddr;     /* program header address */
                   1330:        Elf_Addr        arg_phentsize;  /* Size of program header */
                   1331:        Elf_Addr        arg_phnum;      /* Number of program headers */
                   1332: };
                   1333: #endif
                   1334: 
                   1335: #ifdef _KERNEL_OPT
                   1336: #include "opt_execfmt.h"
                   1337: #endif
                   1338: 
                   1339: struct ps_strings;
                   1340: struct coredump_iostate;
                   1341: struct note_state;
                   1342: struct exec_package;
                   1343: 
                   1344: #ifdef EXEC_ELF32
                   1345: int    exec_elf32_makecmds(struct lwp *, struct exec_package *);
                   1346: int    elf32_populate_auxv(struct lwp *, struct exec_package *, char **);
                   1347: int    elf32_copyargs(struct lwp *, struct exec_package *,
                   1348:     struct ps_strings *, char **, void *);
                   1349: 
                   1350: int    coredump_elf32(struct lwp *, struct coredump_iostate *);
                   1351: void   coredump_savenote_elf32(struct note_state *, unsigned int,
                   1352:            const char *, void *, size_t);
                   1353: 
                   1354: int    elf32_check_header(Elf32_Ehdr *);
                   1355: #endif
                   1356: 
                   1357: #ifdef EXEC_ELF64
                   1358: int    exec_elf64_makecmds(struct lwp *, struct exec_package *);
                   1359: int    elf64_populate_auxv(struct lwp *, struct exec_package *, char **);
                   1360: int    elf64_copyargs(struct lwp *, struct exec_package *,
                   1361:     struct ps_strings *, char **, void *);
                   1362: 
                   1363: int    coredump_elf64(struct lwp *, struct coredump_iostate *);
                   1364: void   coredump_savenote_elf64(struct note_state *, unsigned int,
                   1365:            const char *, void *, size_t);
                   1366: 
                   1367: int    elf64_check_header(Elf64_Ehdr *);
                   1368: #endif
                   1369: 
                   1370: #endif /* _KERNEL */
                   1371: 
                   1372: #endif /* !_SYS_EXEC_ELF_H_ */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.