1 /*
   2  * CDDL HEADER START
   3  *
   4  * The contents of this file are subject to the terms of the
   5  * Common Development and Distribution License (the "License").
   6  * You may not use this file except in compliance with the License.
   7  *
   8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
   9  * or http://www.opensolaris.org/os/licensing.
  10  * See the License for the specific language governing permissions
  11  * and limitations under the License.
  12  *
  13  * When distributing Covered Code, include this CDDL HEADER in each
  14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  15  * If applicable, add the following below this CDDL HEADER, with the
  16  * fields enclosed by brackets "[]" replaced with your own identifying
  17  * information: Portions Copyright [yyyy] [name of copyright owner]
  18  *
  19  * CDDL HEADER END
  20  */
  21 /*
  22  * Copyright 2012 DEY Storage Systems, Inc.  All rights reserved.
  23  * Copyright (c) 2013, Joyent, Inc. All rights reserved.
  24  */
  25 /*
  26  * Copyright 2010 Sun Microsystems, Inc.  All rights reserved.
  27  * Use is subject to license terms.
  28  */
  29 
  30 /*      Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T     */
  31 /*        All Rights Reserved   */
  32 
  33 
  34 #ifndef _SYS_ELF_H
  35 #define _SYS_ELF_H
  36 
  37 #include <sys/elftypes.h>
  38 
  39 #ifdef  __cplusplus
  40 extern "C" {
  41 #endif
  42 
  43 #define ELF32_FSZ_ADDR  4
  44 #define ELF32_FSZ_HALF  2
  45 #define ELF32_FSZ_OFF   4
  46 #define ELF32_FSZ_SWORD 4
  47 #define ELF32_FSZ_WORD  4
  48 
  49 #define ELF64_FSZ_ADDR  8
  50 #define ELF64_FSZ_HALF  2
  51 #define ELF64_FSZ_OFF   8
  52 #define ELF64_FSZ_SWORD 4
  53 #define ELF64_FSZ_WORD  4
  54 #define ELF64_FSZ_SXWORD 8
  55 #define ELF64_FSZ_XWORD 8
  56 
  57 /*
  58  *      "Enumerations" below use ...NUM as the number of
  59  *      values in the list.  It should be 1 greater than the
  60  *      highest "real" value.
  61  */
  62 
  63 /*
  64  *      ELF header
  65  */
  66 
  67 #define EI_NIDENT       16
  68 
  69 typedef struct {
  70         unsigned char   e_ident[EI_NIDENT];     /* ident bytes */
  71         Elf32_Half      e_type;                 /* file type */
  72         Elf32_Half      e_machine;              /* target machine */
  73         Elf32_Word      e_version;              /* file version */
  74         Elf32_Addr      e_entry;                /* start address */
  75         Elf32_Off       e_phoff;                /* phdr file offset */
  76         Elf32_Off       e_shoff;                /* shdr file offset */
  77         Elf32_Word      e_flags;                /* file flags */
  78         Elf32_Half      e_ehsize;               /* sizeof ehdr */
  79         Elf32_Half      e_phentsize;            /* sizeof phdr */
  80         Elf32_Half      e_phnum;                /* number phdrs */
  81         Elf32_Half      e_shentsize;            /* sizeof shdr */
  82         Elf32_Half      e_shnum;                /* number shdrs */
  83         Elf32_Half      e_shstrndx;             /* shdr string index */
  84 } Elf32_Ehdr;
  85 
  86 #if defined(_LP64) || defined(_LONGLONG_TYPE)
  87 typedef struct {
  88         unsigned char   e_ident[EI_NIDENT];     /* ident bytes */
  89         Elf64_Half      e_type;                 /* file type */
  90         Elf64_Half      e_machine;              /* target machine */
  91         Elf64_Word      e_version;              /* file version */
  92         Elf64_Addr      e_entry;                /* start address */
  93         Elf64_Off       e_phoff;                /* phdr file offset */
  94         Elf64_Off       e_shoff;                /* shdr file offset */
  95         Elf64_Word      e_flags;                /* file flags */
  96         Elf64_Half      e_ehsize;               /* sizeof ehdr */
  97         Elf64_Half      e_phentsize;            /* sizeof phdr */
  98         Elf64_Half      e_phnum;                /* number phdrs */
  99         Elf64_Half      e_shentsize;            /* sizeof shdr */
 100         Elf64_Half      e_shnum;                /* number shdrs */
 101         Elf64_Half      e_shstrndx;             /* shdr string index */
 102 } Elf64_Ehdr;
 103 #endif  /* defined(_LP64) || defined(_LONGLONG_TYPE) */
 104 
 105 
 106 #define EI_MAG0         0       /* e_ident[] indexes */
 107 #define EI_MAG1         1
 108 #define EI_MAG2         2
 109 #define EI_MAG3         3
 110 #define EI_CLASS        4       /* File class */
 111 #define EI_DATA         5       /* Data encoding */
 112 #define EI_VERSION      6       /* File version */
 113 #define EI_OSABI        7       /* Operating system/ABI identification */
 114 #define EI_ABIVERSION   8       /* ABI version */
 115 #define EI_PAD          9       /* Start of padding bytes */
 116 
 117 #define ELFMAG0         0x7f            /* EI_MAG */
 118 #define ELFMAG1         'E'
 119 #define ELFMAG2         'L'
 120 #define ELFMAG3         'F'
 121 #define ELFMAG          "\177ELF"
 122 #define SELFMAG         4
 123 
 124 #define ELFCLASSNONE    0               /* EI_CLASS */
 125 #define ELFCLASS32      1
 126 #define ELFCLASS64      2
 127 #define ELFCLASSNUM     3
 128 
 129 #define ELFDATANONE     0               /* EI_DATA */
 130 #define ELFDATA2LSB     1
 131 #define ELFDATA2MSB     2
 132 #define ELFDATANUM      3
 133 
 134 #define ET_NONE         0               /* e_type */
 135 #define ET_REL          1
 136 #define ET_EXEC         2
 137 #define ET_DYN          3
 138 #define ET_CORE         4
 139 #define ET_NUM          5
 140 #define ET_LOOS         0xfe00          /* OS specific range */
 141 #define ET_LOSUNW       0xfeff
 142 #define ET_SUNWPSEUDO   0xfeff
 143 #define ET_HISUNW       0xfeff
 144 #define ET_HIOS         0xfeff
 145 #define ET_LOPROC       0xff00          /* processor specific range */
 146 #define ET_HIPROC       0xffff
 147 
 148 #define ET_LOPROC       0xff00          /* processor specific range */
 149 #define ET_HIPROC       0xffff
 150 
 151 #define EM_NONE         0               /* e_machine */
 152 #define EM_M32          1               /* AT&T WE 32100 */
 153 #define EM_SPARC        2               /* Sun SPARC */
 154 #define EM_386          3               /* Intel 80386 */
 155 #define EM_68K          4               /* Motorola 68000 */
 156 #define EM_88K          5               /* Motorola 88000 */
 157 #define EM_486          6               /* Intel 80486 */
 158 #define EM_860          7               /* Intel i860 */
 159 #define EM_MIPS         8               /* MIPS RS3000 Big-Endian */
 160 #define EM_S370         9               /* IBM System/370 Processor */
 161 #define EM_MIPS_RS3_LE  10              /* MIPS RS3000 Little-Endian */
 162 #define EM_RS6000       11              /* RS6000 */
 163 #define EM_UNKNOWN12    12
 164 #define EM_UNKNOWN13    13
 165 #define EM_UNKNOWN14    14
 166 #define EM_PA_RISC      15              /* PA-RISC */
 167 #define EM_PARISC       EM_PA_RISC      /* Alias: GNU compatibility */
 168 #define EM_nCUBE        16              /* nCUBE */
 169 #define EM_VPP500       17              /* Fujitsu VPP500 */
 170 #define EM_SPARC32PLUS  18              /* Sun SPARC 32+ */
 171 #define EM_960          19              /* Intel 80960 */
 172 #define EM_PPC          20              /* PowerPC */
 173 #define EM_PPC64        21              /* 64-bit PowerPC */
 174 #define EM_S390         22              /* IBM System/390 Processor */
 175 #define EM_UNKNOWN22    EM_S390         /* Alias: Older published name */
 176 #define EM_UNKNOWN23    23
 177 #define EM_UNKNOWN24    24
 178 #define EM_UNKNOWN25    25
 179 #define EM_UNKNOWN26    26
 180 #define EM_UNKNOWN27    27
 181 #define EM_UNKNOWN28    28
 182 #define EM_UNKNOWN29    29
 183 #define EM_UNKNOWN30    30
 184 #define EM_UNKNOWN31    31
 185 #define EM_UNKNOWN32    32
 186 #define EM_UNKNOWN33    33
 187 #define EM_UNKNOWN34    34
 188 #define EM_UNKNOWN35    35
 189 #define EM_V800         36              /* NEX V800 */
 190 #define EM_FR20         37              /* Fujitsu FR20 */
 191 #define EM_RH32         38              /* TRW RH-32 */
 192 #define EM_RCE          39              /* Motorola RCE */
 193 #define EM_ARM          40              /* Advanced RISC Marchines ARM */
 194 #define EM_ALPHA        41              /* Digital Alpha */
 195 #define EM_SH           42              /* Hitachi SH */
 196 #define EM_SPARCV9      43              /* Sun SPARC V9 (64-bit) */
 197 #define EM_TRICORE      44              /* Siemens Tricore embedded processor */
 198 #define EM_ARC          45              /* Argonaut RISC Core, */
 199                                         /*      Argonaut Technologies Inc. */
 200 #define EM_H8_300       46              /* Hitachi H8/300 */
 201 #define EM_H8_300H      47              /* Hitachi H8/300H */
 202 #define EM_H8S          48              /* Hitachi H8S */
 203 #define EM_H8_500       49              /* Hitachi H8/500 */
 204 #define EM_IA_64        50              /* Intel IA64 */
 205 #define EM_MIPS_X       51              /* Stanford MIPS-X */
 206 #define EM_COLDFIRE     52              /* Motorola ColdFire */
 207 #define EM_68HC12       53              /* Motorola M68HC12 */
 208 #define EM_MMA          54              /* Fujitsu MMA Mulimedia Accelerator */
 209 #define EM_PCP          55              /* Siemens PCP */
 210 #define EM_NCPU         56              /* Sony nCPU embedded RISC processor */
 211 #define EM_NDR1         57              /* Denso NDR1 microprocessor */
 212 #define EM_STARCORE     58              /* Motorola Star*Core processor */
 213 #define EM_ME16         59              /* Toyota ME16 processor */
 214 #define EM_ST100        60              /* STMicroelectronics ST100 processor */
 215 #define EM_TINYJ        61              /* Advanced Logic Corp. TinyJ */
 216                                         /*      embedded processor family */
 217 #define EM_AMD64        62              /* AMDs x86-64 architecture */
 218 #define EM_X86_64       EM_AMD64        /* (compatibility) */
 219 
 220 #define EM_PDSP         63              /* Sony DSP Processor */
 221 #define EM_UNKNOWN64    64
 222 #define EM_UNKNOWN65    65
 223 #define EM_FX66         66              /* Siemens FX66 microcontroller */
 224 #define EM_ST9PLUS      67              /* STMicroelectronics ST9+8/16 bit */
 225                                         /*      microcontroller */
 226 #define EM_ST7          68              /* STMicroelectronics ST7 8-bit */
 227                                         /*      microcontroller */
 228 #define EM_68HC16       69              /* Motorola MC68HC16 Microcontroller */
 229 #define EM_68HC11       70              /* Motorola MC68HC11 Microcontroller */
 230 #define EM_68HC08       71              /* Motorola MC68HC08 Microcontroller */
 231 #define EM_68HC05       72              /* Motorola MC68HC05 Microcontroller */
 232 #define EM_SVX          73              /* Silicon Graphics SVx */
 233 #define EM_ST19         74              /* STMicroelectronics ST19 8-bit */
 234                                         /*      microcontroller */
 235 #define EM_VAX          75              /* Digital VAX */
 236 #define EM_CRIS         76              /* Axis Communications 32-bit */
 237                                         /*      embedded processor */
 238 #define EM_JAVELIN      77              /* Infineon Technologies 32-bit */
 239                                         /*      embedded processor */
 240 #define EM_FIREPATH     78              /* Element 14 64-bit DSP Processor */
 241 #define EM_ZSP          79              /* LSI Logic 16-bit DSP Processor */
 242 #define EM_MMIX         80              /* Donald Knuth's educational */
 243                                         /*      64-bit processor */
 244 #define EM_HUANY        81              /* Harvard University */
 245                                         /*      machine-independent */
 246                                         /*      object files */
 247 #define EM_PRISM        82              /* SiTera Prism */
 248 #define EM_AVR          83              /* Atmel AVR 8-bit microcontroller */
 249 #define EM_FR30         84              /* Fujitsu FR30 */
 250 #define EM_D10V         85              /* Mitsubishi D10V */
 251 #define EM_D30V         86              /* Mitsubishi D30V */
 252 #define EM_V850         87              /* NEC v850 */
 253 #define EM_M32R         88              /* Mitsubishi M32R */
 254 #define EM_MN10300      89              /* Matsushita MN10300 */
 255 #define EM_MN10200      90              /* Matsushita MN10200 */
 256 #define EM_PJ           91              /* picoJava */
 257 #define EM_OPENRISC     92              /* OpenRISC 32-bit embedded processor */
 258 #define EM_ARC_A5       93              /* ARC Cores Tangent-A5 */
 259 #define EM_XTENSA       94              /* Tensilica Xtensa architecture */
 260 #define EM_NUM          95
 261 
 262 #define EV_NONE         0               /* e_version, EI_VERSION */
 263 #define EV_CURRENT      1
 264 #define EV_NUM          2
 265 
 266 
 267 #define ELFOSABI_NONE           0       /* No extensions or unspecified */
 268 #define ELFOSABI_SYSV           ELFOSABI_NONE
 269 #define ELFOSABI_HPUX           1       /* Hewlett-Packard HP-UX */
 270 #define ELFOSABI_NETBSD         2       /* NetBSD */
 271 #define ELFOSABI_LINUX          3       /* Linux */
 272 #define ELFOSABI_UNKNOWN4       4
 273 #define ELFOSABI_UNKNOWN5       5
 274 #define ELFOSABI_SOLARIS        6       /* Sun Solaris */
 275 #define ELFOSABI_AIX            7       /* AIX */
 276 #define ELFOSABI_IRIX           8       /* IRIX */
 277 #define ELFOSABI_FREEBSD        9       /* FreeBSD */
 278 #define ELFOSABI_TRU64          10      /* Compaq TRU64 UNIX */
 279 #define ELFOSABI_MODESTO        11      /* Novell Modesto */
 280 #define ELFOSABI_OPENBSD        12      /* Open BSD */
 281 #define ELFOSABI_OPENVMS        13      /* Open VMS */
 282 #define ELFOSABI_NSK            14      /* Hewlett-Packard Non-Stop Kernel */
 283 #define ELFOSABI_AROS           15      /* Amiga Research OS */
 284 #define ELFOSABI_ARM            97      /* ARM */
 285 #define ELFOSABI_STANDALONE     255     /* standalone (embedded) application */
 286 
 287 #define EAV_SUNW_NONE           0       /* EI_ABIVERSION */
 288 #define EAV_SUNW_CURRENT        1
 289 #define EAV_SUNW_NUM            2
 290 
 291 
 292 /*
 293  *      Program header
 294  */
 295 
 296 typedef struct {
 297         Elf32_Word      p_type;         /* entry type */
 298         Elf32_Off       p_offset;       /* file offset */
 299         Elf32_Addr      p_vaddr;        /* virtual address */
 300         Elf32_Addr      p_paddr;        /* physical address */
 301         Elf32_Word      p_filesz;       /* file size */
 302         Elf32_Word      p_memsz;        /* memory size */
 303         Elf32_Word      p_flags;        /* entry flags */
 304         Elf32_Word      p_align;        /* memory/file alignment */
 305 } Elf32_Phdr;
 306 
 307 #if defined(_LP64) || defined(_LONGLONG_TYPE)
 308 typedef struct {
 309         Elf64_Word      p_type;         /* entry type */
 310         Elf64_Word      p_flags;        /* entry flags */
 311         Elf64_Off       p_offset;       /* file offset */
 312         Elf64_Addr      p_vaddr;        /* virtual address */
 313         Elf64_Addr      p_paddr;        /* physical address */
 314         Elf64_Xword     p_filesz;       /* file size */
 315         Elf64_Xword     p_memsz;        /* memory size */
 316         Elf64_Xword     p_align;        /* memory/file alignment */
 317 } Elf64_Phdr;
 318 #endif  /* defined(_LP64) || defined(_LONGLONG_TYPE) */
 319 
 320 
 321 #define PT_NULL         0               /* p_type */
 322 #define PT_LOAD         1
 323 #define PT_DYNAMIC      2
 324 #define PT_INTERP       3
 325 #define PT_NOTE         4
 326 #define PT_SHLIB        5
 327 #define PT_PHDR         6
 328 #define PT_TLS          7
 329 #define PT_NUM          8
 330 
 331 #define PT_LOOS         0x60000000      /* OS specific range */
 332 
 333 /*
 334  * PT_SUNW_UNWIND and PT_SUNW_EH_FRAME perform the same function,
 335  * providing access to the .eh_frame_hdr section of the object.
 336  * PT_SUNW_UNWIND is the original value, while PT_SUNW_EH_FRAME is
 337  * required by the amd64 psABI. The Solaris link-editor (ld) tags output
 338  * objects with PT_SUNW_UNWIND, but the Solaris runtime linker (ld.so.1)
 339  * will accept and use either value.
 340  */
 341 #define PT_SUNW_UNWIND          0x6464e550
 342 #define PT_SUNW_EH_FRAME        0x6474e550
 343 #define PT_GNU_EH_FRAME         PT_SUNW_EH_FRAME
 344 
 345 /*
 346  * Linux specific program headers not currently used by Solaris
 347  */
 348 #define PT_GNU_STACK    0x6474e551      /* Indicates stack executability */
 349 #define PT_GNU_RELRO    0x6474e552      /* Read-only after relocation */
 350 
 351 #define PT_LOSUNW       0x6ffffffa
 352 #define PT_SUNWBSS      0x6ffffffa      /* Sun Specific segment (unused) */
 353 #define PT_SUNWSTACK    0x6ffffffb      /* describes the stack segment */
 354 #define PT_SUNWDTRACE   0x6ffffffc      /* private */
 355 #define PT_SUNWCAP      0x6ffffffd      /* hard/soft capabilities segment */
 356 #define PT_HISUNW       0x6fffffff
 357 #define PT_HIOS         0x6fffffff
 358 
 359 #define PT_LOPROC       0x70000000      /* processor specific range */
 360 #define PT_HIPROC       0x7fffffff
 361 
 362 #define PF_R            0x4             /* p_flags */
 363 #define PF_W            0x2
 364 #define PF_X            0x1
 365 
 366 #define PF_MASKOS       0x0ff00000      /* OS specific values */
 367 #define PF_MASKPROC     0xf0000000      /* processor specific values */
 368 
 369 #define PF_SUNW_FAILURE 0x00100000      /* mapping absent due to failure */
 370 #define PF_SUNW_KILLED  0x00200000      /* signal received during dump */
 371 #define PF_SUNW_SIGINFO 0x00400000      /* segment has killing sig's siginfo */
 372 
 373 #define PN_XNUM         0xffff          /* extended program header index */
 374 
 375 /*
 376  *      Section header
 377  */
 378 
 379 typedef struct {
 380         Elf32_Word      sh_name;        /* section name */
 381         Elf32_Word      sh_type;        /* SHT_... */
 382         Elf32_Word      sh_flags;       /* SHF_... */
 383         Elf32_Addr      sh_addr;        /* virtual address */
 384         Elf32_Off       sh_offset;      /* file offset */
 385         Elf32_Word      sh_size;        /* section size */
 386         Elf32_Word      sh_link;        /* misc info */
 387         Elf32_Word      sh_info;        /* misc info */
 388         Elf32_Word      sh_addralign;   /* memory alignment */
 389         Elf32_Word      sh_entsize;     /* entry size if table */
 390 } Elf32_Shdr;
 391 
 392 #if defined(_LP64) || defined(_LONGLONG_TYPE)
 393 typedef struct {
 394         Elf64_Word      sh_name;        /* section name */
 395         Elf64_Word      sh_type;        /* SHT_... */
 396         Elf64_Xword     sh_flags;       /* SHF_... */
 397         Elf64_Addr      sh_addr;        /* virtual address */
 398         Elf64_Off       sh_offset;      /* file offset */
 399         Elf64_Xword     sh_size;        /* section size */
 400         Elf64_Word      sh_link;        /* misc info */
 401         Elf64_Word      sh_info;        /* misc info */
 402         Elf64_Xword     sh_addralign;   /* memory alignment */
 403         Elf64_Xword     sh_entsize;     /* entry size if table */
 404 } Elf64_Shdr;
 405 #endif  /* defined(_LP64) || defined(_LONGLONG_TYPE) */
 406 
 407 #define SHT_NULL                0               /* sh_type */
 408 #define SHT_PROGBITS            1
 409 #define SHT_SYMTAB              2
 410 #define SHT_STRTAB              3
 411 #define SHT_RELA                4
 412 #define SHT_HASH                5
 413 #define SHT_DYNAMIC             6
 414 #define SHT_NOTE                7
 415 #define SHT_NOBITS              8
 416 #define SHT_REL                 9
 417 #define SHT_SHLIB               10
 418 #define SHT_DYNSYM              11
 419 #define SHT_UNKNOWN12           12
 420 #define SHT_UNKNOWN13           13
 421 #define SHT_INIT_ARRAY          14
 422 #define SHT_FINI_ARRAY          15
 423 #define SHT_PREINIT_ARRAY       16
 424 #define SHT_GROUP               17
 425 #define SHT_SYMTAB_SHNDX        18
 426 #define SHT_NUM                 19
 427 
 428 /* Solaris ABI specific values */
 429 #define SHT_LOOS                0x60000000      /* OS specific range */
 430 #define SHT_LOSUNW              0x6fffffef
 431 #define SHT_SUNW_capchain       0x6fffffef
 432 #define SHT_SUNW_capinfo        0x6ffffff0
 433 #define SHT_SUNW_symsort        0x6ffffff1
 434 #define SHT_SUNW_tlssort        0x6ffffff2
 435 #define SHT_SUNW_LDYNSYM        0x6ffffff3
 436 #define SHT_SUNW_dof            0x6ffffff4
 437 #define SHT_SUNW_cap            0x6ffffff5
 438 #define SHT_SUNW_SIGNATURE      0x6ffffff6
 439 #define SHT_SUNW_ANNOTATE       0x6ffffff7
 440 #define SHT_SUNW_DEBUGSTR       0x6ffffff8
 441 #define SHT_SUNW_DEBUG          0x6ffffff9
 442 #define SHT_SUNW_move           0x6ffffffa
 443 #define SHT_SUNW_COMDAT         0x6ffffffb
 444 #define SHT_SUNW_syminfo        0x6ffffffc
 445 #define SHT_SUNW_verdef         0x6ffffffd
 446 #define SHT_GNU_verdef          SHT_SUNW_verdef
 447 #define SHT_SUNW_verneed        0x6ffffffe
 448 #define SHT_GNU_verneed         SHT_SUNW_verneed
 449 #define SHT_SUNW_versym         0x6fffffff
 450 #define SHT_GNU_versym          SHT_SUNW_versym
 451 #define SHT_HISUNW              0x6fffffff
 452 #define SHT_HIOS                0x6fffffff
 453 
 454 /*
 455  * GNU/Linux OSABI specific values with different meanings than under Solaris.
 456  * Due to the overlap in assigned values with the Solaris OSABI, correct
 457  * interpretation of these values requires knowledge of the OSABI used by
 458  * the object.
 459  */
 460 #define SHT_GNU_ATTRIBUTES      0x6ffffff5      /* Object attributes */
 461 #define SHT_GNU_HASH            0x6ffffff6      /* GNU-style hash table */
 462 #define SHT_GNU_LIBLIST         0x6ffffff7      /* Prelink library list */
 463 #define SHT_CHECKSUM            0x6ffffff8      /* Checksum for DSO content */
 464 
 465 #define SHT_LOPROC      0x70000000      /* processor specific range */
 466 #define SHT_HIPROC      0x7fffffff
 467 
 468 #define SHT_LOUSER      0x80000000
 469 #define SHT_HIUSER      0xffffffff
 470 
 471 #define SHF_WRITE               0x01            /* sh_flags */
 472 #define SHF_ALLOC               0x02
 473 #define SHF_EXECINSTR           0x04
 474 #define SHF_MERGE               0x10
 475 #define SHF_STRINGS             0x20
 476 #define SHF_INFO_LINK           0x40
 477 #define SHF_LINK_ORDER          0x80
 478 #define SHF_OS_NONCONFORMING    0x100
 479 #define SHF_GROUP               0x200
 480 #define SHF_TLS                 0x400
 481 
 482 #define SHF_MASKOS      0x0ff00000      /* OS specific values */
 483 
 484 
 485 #define SHF_MASKPROC    0xf0000000      /* processor specific values */
 486 
 487 #define SHN_UNDEF       0               /* special section numbers */
 488 #define SHN_LORESERVE   0xff00
 489 #define SHN_LOPROC      0xff00          /* processor specific range */
 490 #define SHN_HIPROC      0xff1f
 491 #define SHN_LOOS        0xff20          /* OS specific range */
 492 #define SHN_LOSUNW      0xff3f
 493 #define SHN_SUNW_IGNORE 0xff3f
 494 #define SHN_HISUNW      0xff3f
 495 #define SHN_HIOS        0xff3f
 496 #define SHN_ABS         0xfff1
 497 #define SHN_COMMON      0xfff2
 498 #define SHN_XINDEX      0xffff          /* extended sect index */
 499 #define SHN_HIRESERVE   0xffff
 500 
 501 
 502 
 503 /*
 504  *      Symbol table
 505  */
 506 
 507 typedef struct {
 508         Elf32_Word      st_name;
 509         Elf32_Addr      st_value;
 510         Elf32_Word      st_size;
 511         unsigned char   st_info;        /* bind, type: ELF_32_ST_... */
 512         unsigned char   st_other;
 513         Elf32_Half      st_shndx;       /* SHN_... */
 514 } Elf32_Sym;
 515 
 516 #if defined(_LP64) || defined(_LONGLONG_TYPE)
 517 typedef struct {
 518         Elf64_Word      st_name;
 519         unsigned char   st_info;        /* bind, type: ELF_64_ST_... */
 520         unsigned char   st_other;
 521         Elf64_Half      st_shndx;       /* SHN_... */
 522         Elf64_Addr      st_value;
 523         Elf64_Xword     st_size;
 524 } Elf64_Sym;
 525 #endif  /* defined(_LP64) || defined(_LONGLONG_TYPE) */
 526 
 527 #define STN_UNDEF       0
 528 
 529 /*
 530  *      Macros to compose and decompose values for S.st_info
 531  *
 532  *      bind = ELF32_ST_BIND(S.st_info)
 533  *      type = ELF32_ST_TYPE(S.st_info)
 534  *      S.st_info = ELF32_ST_INFO(bind, type)
 535  */
 536 
 537 #define ELF32_ST_BIND(info)             ((info) >> 4)
 538 #define ELF32_ST_TYPE(info)             ((info) & 0xf)
 539 #define ELF32_ST_INFO(bind, type)       (((bind)<<4)+((type)&0xf))
 540 
 541 #define ELF64_ST_BIND(info)             ((info) >> 4)
 542 #define ELF64_ST_TYPE(info)             ((info) & 0xf)
 543 #define ELF64_ST_INFO(bind, type)       (((bind)<<4)+((type)&0xf))
 544 
 545 
 546 #define STB_LOCAL       0               /* BIND */
 547 #define STB_GLOBAL      1
 548 #define STB_WEAK        2
 549 #define STB_NUM         3
 550 
 551 #define STB_LOPROC      13              /* processor specific range */
 552 #define STB_HIPROC      15
 553 
 554 #define STT_NOTYPE      0               /* symbol type is unspecified */
 555 #define STT_OBJECT      1               /* data object */
 556 #define STT_FUNC        2               /* code object */
 557 #define STT_SECTION     3               /* symbol identifies an ELF section */
 558 #define STT_FILE        4               /* symbol's name is file name */
 559 #define STT_COMMON      5               /* common data object */
 560 #define STT_TLS         6               /* thread-local data object */
 561 #define STT_NUM         7               /* # defined types in generic range */
 562 #define STT_LOOS        10              /* OS specific range */
 563 #define STT_HIOS        12
 564 #define STT_LOPROC      13              /* processor specific range */
 565 #define STT_HIPROC      15
 566 
 567 /*
 568  *      Macros to decompose values for S.st_other
 569  *
 570  *      visibility = ELF32_ST_VISIBILITY(S.st_other)
 571  */
 572 #define ELF32_ST_VISIBILITY(other)      ((other)&0x7)
 573 #define ELF64_ST_VISIBILITY(other)      ((other)&0x7)
 574 
 575 #define STV_DEFAULT     0
 576 #define STV_INTERNAL    1
 577 #define STV_HIDDEN      2
 578 #define STV_PROTECTED   3
 579 #define STV_EXPORTED    4
 580 #define STV_SINGLETON   5
 581 #define STV_ELIMINATE   6
 582 
 583 #define STV_NUM         7
 584 
 585 /*
 586  *      Relocation
 587  */
 588 
 589 typedef struct {
 590         Elf32_Addr      r_offset;
 591         Elf32_Word      r_info;         /* sym, type: ELF32_R_... */
 592 } Elf32_Rel;
 593 
 594 typedef struct {
 595         Elf32_Addr      r_offset;
 596         Elf32_Word      r_info;         /* sym, type: ELF32_R_... */
 597         Elf32_Sword     r_addend;
 598 } Elf32_Rela;
 599 
 600 #if defined(_LP64) || defined(_LONGLONG_TYPE)
 601 typedef struct {
 602         Elf64_Addr      r_offset;
 603         Elf64_Xword     r_info;         /* sym, type: ELF64_R_... */
 604 } Elf64_Rel;
 605 
 606 typedef struct {
 607         Elf64_Addr      r_offset;
 608         Elf64_Xword     r_info;         /* sym, type: ELF64_R_... */
 609         Elf64_Sxword    r_addend;
 610 } Elf64_Rela;
 611 #endif  /* defined(_LP64) || defined(_LONGLONG_TYPE) */
 612 
 613 
 614 /*
 615  *      Macros to compose and decompose values for Rel.r_info, Rela.f_info
 616  *
 617  *      sym = ELF32_R_SYM(R.r_info)
 618  *      type = ELF32_R_TYPE(R.r_info)
 619  *      R.r_info = ELF32_R_INFO(sym, type)
 620  */
 621 
 622 #define ELF32_R_SYM(info)       ((info)>>8)
 623 #define ELF32_R_TYPE(info)      ((unsigned char)(info))
 624 #define ELF32_R_INFO(sym, type) (((sym)<<8)+(unsigned char)(type))
 625 
 626 #define ELF64_R_SYM(info)       ((info)>>32)
 627 #define ELF64_R_TYPE(info)      ((Elf64_Word)(info))
 628 #define ELF64_R_INFO(sym, type) (((Elf64_Xword)(sym)<<32)+(Elf64_Xword)(type))
 629 
 630 
 631 /*
 632  * The r_info field is composed of two 32-bit components: the symbol
 633  * table index and the relocation type.  The relocation type for SPARC V9
 634  * is further decomposed into an 8-bit type identifier and a 24-bit type
 635  * dependent data field.  For the existing Elf32 relocation types,
 636  * that data field is zero.
 637  */
 638 #define ELF64_R_TYPE_DATA(info) (((Elf64_Xword)(info)<<32)>>40)
 639 #define ELF64_R_TYPE_ID(info)   (((Elf64_Xword)(info)<<56)>>56)
 640 #define ELF64_R_TYPE_INFO(data, type)   \
 641                 (((Elf64_Xword)(data)<<8)+(Elf64_Xword)(type))
 642 
 643 
 644 /*
 645  * Section Group Flags (SHT_GROUP)
 646  */
 647 #define GRP_COMDAT      0x01
 648 
 649 
 650 /*
 651  *      Note entry header
 652  */
 653 
 654 typedef struct {
 655         Elf32_Word      n_namesz;       /* length of note's name */
 656         Elf32_Word      n_descsz;       /* length of note's "desc" */
 657         Elf32_Word      n_type;         /* type of note */
 658 } Elf32_Nhdr;
 659 
 660 #if defined(_LP64) || defined(_LONGLONG_TYPE)
 661 typedef struct {
 662         Elf64_Word      n_namesz;       /* length of note's name */
 663         Elf64_Word      n_descsz;       /* length of note's "desc" */
 664         Elf64_Word      n_type;         /* type of note */
 665 } Elf64_Nhdr;
 666 #endif  /* defined(_LP64) || defined(_LONGLONG_TYPE) */
 667 
 668 /*
 669  *      Move entry
 670  */
 671 #if defined(_LP64) || defined(_LONGLONG_TYPE)
 672 typedef struct {
 673         Elf32_Lword     m_value;        /* symbol value */
 674         Elf32_Word      m_info;         /* size + index */
 675         Elf32_Word      m_poffset;      /* symbol offset */
 676         Elf32_Half      m_repeat;       /* repeat count */
 677         Elf32_Half      m_stride;       /* stride info */
 678 } Elf32_Move;
 679 
 680 /*
 681  *      Macros to compose and decompose values for Move.r_info
 682  *
 683  *      sym = ELF32_M_SYM(M.m_info)
 684  *      size = ELF32_M_SIZE(M.m_info)
 685  *      M.m_info = ELF32_M_INFO(sym, size)
 686  */
 687 #define ELF32_M_SYM(info)       ((info)>>8)
 688 #define ELF32_M_SIZE(info)      ((unsigned char)(info))
 689 #define ELF32_M_INFO(sym, size) (((sym)<<8)+(unsigned char)(size))
 690 
 691 typedef struct {
 692         Elf64_Lword     m_value;        /* symbol value */
 693         Elf64_Xword     m_info;         /* size + index */
 694         Elf64_Xword     m_poffset;      /* symbol offset */
 695         Elf64_Half      m_repeat;       /* repeat count */
 696         Elf64_Half      m_stride;       /* stride info */
 697 } Elf64_Move;
 698 #define ELF64_M_SYM(info)       ((info)>>8)
 699 #define ELF64_M_SIZE(info)      ((unsigned char)(info))
 700 #define ELF64_M_INFO(sym, size) (((sym)<<8)+(unsigned char)(size))
 701 
 702 #endif  /* defined(_LP64) || defined(_LONGLONG_TYPE) */
 703 
 704 
 705 /*
 706  *      Capabilities entry, Capabilities info and Capabilities chain.
 707  */
 708 #ifndef _ASM
 709 typedef struct {
 710         Elf32_Word      c_tag;          /* how to interpret value */
 711         union {
 712                 Elf32_Word      c_val;
 713                 Elf32_Addr      c_ptr;
 714         } c_un;
 715 } Elf32_Cap;
 716 
 717 typedef Elf32_Word      Elf32_Capinfo;
 718 typedef Elf32_Word      Elf32_Capchain;
 719 
 720 /*
 721  *      Macros to compose and decompose values for capabilities info.
 722  *
 723  *      sym = ELF32_C_SYM(info)
 724  *      grp = ELF32_C_GROUP(info)
 725  *      info = ELF32_C_INFO(sym, grp)
 726  */
 727 #define ELF32_C_SYM(info)       ((info)>>8)
 728 #define ELF32_C_GROUP(info)     ((unsigned char)(info))
 729 #define ELF32_C_INFO(sym, grp)  (((sym)<<8)+(unsigned char)(grp))
 730 
 731 
 732 #if defined(_LP64) || defined(_LONGLONG_TYPE)
 733 typedef struct {
 734         Elf64_Xword     c_tag;          /* how to interpret value */
 735         union {
 736                 Elf64_Xword     c_val;
 737                 Elf64_Addr      c_ptr;
 738         } c_un;
 739 } Elf64_Cap;
 740 
 741 typedef Elf64_Xword     Elf64_Capinfo;
 742 typedef Elf64_Word      Elf64_Capchain;
 743 
 744 /*
 745  *      Macros to compose and decompose values for capabilities info.
 746  *
 747  *      sym = ELF64_C_SYM(info)
 748  *      grp = ELF64_C_GROUP(info)
 749  *      info = ELF64_C_INFO(sym, grp)
 750  */
 751 #define ELF64_C_SYM(info)       ((info)>>32)
 752 #define ELF64_C_GROUP(info)     ((Elf64_Word)(info))
 753 #define ELF64_C_INFO(sym, grp)  (((Elf64_Xword)(sym)<<32)+(Elf64_Xword)(grp))
 754 
 755 #endif  /* defined(_LP64) || defined(_LONGLONG_TYPE) */
 756 #endif
 757 
 758 /*
 759  * Version numbers for SHT_SUNW_capinfo and SHT_SUNW_capchain.
 760  */
 761 #define CAPINFO_NONE            0
 762 #define CAPINFO_CURRENT         1
 763 #define CAPINFO_NUM             2
 764 
 765 #define CAPCHAIN_NONE           0
 766 #define CAPCHAIN_CURRENT        1
 767 #define CAPCHAIN_NUM            2
 768 
 769 /*
 770  * A SHT_SUNW_capinfo table mirrors a symbol table.  A capabilities symbol has
 771  * a SHT_SUNW_capinfo table entry that provides an index into the associated
 772  * SHT_SUNW_cap capabilities group, and the symbol index of the associated lead
 773  * symbol.  A capabilities symbol is a local symbol.  A global lead capabilities
 774  * symbol is tagged with a group CAPINFO_SUNW_GLOB.
 775  */
 776 #define CAPINFO_SUNW_GLOB       0xff
 777 
 778 /*
 779  * Capabilities values.
 780  */
 781 #define CA_SUNW_NULL    0
 782 #define CA_SUNW_HW_1    1               /* first hardware capabilities entry */
 783 #define CA_SUNW_SF_1    2               /* first software capabilities entry */
 784 #define CA_SUNW_HW_2    3               /* second hardware capabilities entry */
 785 #define CA_SUNW_PLAT    4               /* platform capability entry */
 786 #define CA_SUNW_MACH    5               /* machine capability entry */
 787 #define CA_SUNW_ID      6               /* capability identifier */
 788 #define CA_SUNW_NUM     7
 789 
 790 /*
 791  * Define software capabilities (CA_SUNW_SF_1 values).  Note, hardware
 792  * capabilities (CA_SUNW_HW_1 values) are taken directly from sys/auxv_$MACH.h.
 793  */
 794 #define SF1_SUNW_FPKNWN 0x001           /* frame pointer usage is known */
 795 #define SF1_SUNW_FPUSED 0x002           /* frame pointer is in use */
 796 #define SF1_SUNW_ADDR32 0x004           /* 32-bit address space requirement */
 797 #define SF1_SUNW_MASK   0x007           /* known software capabilities mask */
 798 
 799 /*
 800  *      Known values for note entry types (e_type == ET_CORE)
 801  */
 802 #define NT_PRSTATUS     1       /* prstatus_t   <sys/old_procfs.h>        */
 803 #define NT_PRFPREG      2       /* prfpregset_t <sys/old_procfs.h>        */
 804 #define NT_PRPSINFO     3       /* prpsinfo_t   <sys/old_procfs.h>        */
 805 #define NT_PRXREG       4       /* prxregset_t  <sys/procfs.h>            */
 806 #define NT_PLATFORM     5       /* string from sysinfo(SI_PLATFORM)     */
 807 #define NT_AUXV         6       /* auxv_t array <sys/auxv.h>              */
 808 #define NT_GWINDOWS     7       /* gwindows_t   SPARC only              */
 809 #define NT_ASRS         8       /* asrset_t     SPARC V9 only           */
 810 #define NT_LDT          9       /* ssd array    <sys/sysi86.h> IA32 only */
 811 #define NT_PSTATUS      10      /* pstatus_t    <sys/procfs.h>            */
 812 #define NT_PSINFO       13      /* psinfo_t     <sys/procfs.h>            */
 813 #define NT_PRCRED       14      /* prcred_t     <sys/procfs.h>            */
 814 #define NT_UTSNAME      15      /* struct utsname <sys/utsname.h> */
 815 #define NT_LWPSTATUS    16      /* lwpstatus_t  <sys/procfs.h>            */
 816 #define NT_LWPSINFO     17      /* lwpsinfo_t   <sys/procfs.h>            */
 817 #define NT_PRPRIV       18      /* prpriv_t     <sys/procfs.h>            */
 818 #define NT_PRPRIVINFO   19      /* priv_impl_info_t <sys/priv.h>  */
 819 #define NT_CONTENT      20      /* core_content_t <sys/corectl.h> */
 820 #define NT_ZONENAME     21      /* string from getzonenamebyid(3C)      */
 821 #define NT_FDINFO       22      /* open fd info                         */
 822 #define NT_SPYMASTER    23      /* psinfo_t for agent LWP spymaster     */
 823 #define NT_SECFLAGS     24      /* process security-flags */
 824 #define NT_NUM          24
 825 
 826 
 827 #ifdef _KERNEL
 828 /*
 829  * The following routine checks the processor-specific
 830  * fields of an ELF header.
 831  */
 832 int     elfheadcheck(unsigned char, Elf32_Half, Elf32_Word);
 833 #endif
 834 
 835 #ifdef  __cplusplus
 836 }
 837 #endif
 838 
 839 #if defined(ELF_TARGET_ALL) || defined(ELF_TARGET_SPARC)
 840 #include <sys/elf_SPARC.h>
 841 #endif
 842 
 843 #if defined(ELF_TARGET_ALL) || defined(ELF_TARGET_386)
 844 #include <sys/elf_386.h>
 845 #endif
 846 
 847 #if defined(ELF_TARGET_ALL) || defined(ELF_TARGET_AMD64)
 848 #include <sys/elf_amd64.h>
 849 #endif
 850 
 851 #endif  /* _SYS_ELF_H */