The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/sys/exec_elf.h

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

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

Cache object: 10ada8a063dbb5c92c11b4a271cfe581


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.