1*9f84b6f2SJerome Forissier /* SPDX-License-Identifier: BSD-2-Clause */ 2*9f84b6f2SJerome Forissier /*- 3*9f84b6f2SJerome Forissier * Copyright (c) 1996-1998 John D. Polstra. 4*9f84b6f2SJerome Forissier * All rights reserved. 5*9f84b6f2SJerome Forissier * 6*9f84b6f2SJerome Forissier * Redistribution and use in source and binary forms, with or without 7*9f84b6f2SJerome Forissier * modification, are permitted provided that the following conditions 8*9f84b6f2SJerome Forissier * are met: 9*9f84b6f2SJerome Forissier * 1. Redistributions of source code must retain the above copyright 10*9f84b6f2SJerome Forissier * notice, this list of conditions and the following disclaimer. 11*9f84b6f2SJerome Forissier * 2. Redistributions in binary form must reproduce the above copyright 12*9f84b6f2SJerome Forissier * notice, this list of conditions and the following disclaimer in the 13*9f84b6f2SJerome Forissier * documentation and/or other materials provided with the distribution. 14*9f84b6f2SJerome Forissier * 15*9f84b6f2SJerome Forissier * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 16*9f84b6f2SJerome Forissier * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 17*9f84b6f2SJerome Forissier * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 18*9f84b6f2SJerome Forissier * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 19*9f84b6f2SJerome Forissier * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 20*9f84b6f2SJerome Forissier * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 21*9f84b6f2SJerome Forissier * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 22*9f84b6f2SJerome Forissier * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 23*9f84b6f2SJerome Forissier * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 24*9f84b6f2SJerome Forissier * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 25*9f84b6f2SJerome Forissier * SUCH DAMAGE. 26*9f84b6f2SJerome Forissier * 27*9f84b6f2SJerome Forissier * $FreeBSD$ 28*9f84b6f2SJerome Forissier */ 29*9f84b6f2SJerome Forissier 30*9f84b6f2SJerome Forissier #ifndef _SYS_ELF64_H_ 31*9f84b6f2SJerome Forissier #define _SYS_ELF64_H_ 1 32*9f84b6f2SJerome Forissier 33*9f84b6f2SJerome Forissier #include <elf_common.h> 34*9f84b6f2SJerome Forissier #include <stdint.h> 35*9f84b6f2SJerome Forissier 36*9f84b6f2SJerome Forissier /* 37*9f84b6f2SJerome Forissier * ELF definitions common to all 64-bit architectures. 38*9f84b6f2SJerome Forissier */ 39*9f84b6f2SJerome Forissier 40*9f84b6f2SJerome Forissier typedef uint64_t Elf64_Addr; 41*9f84b6f2SJerome Forissier typedef uint16_t Elf64_Half; 42*9f84b6f2SJerome Forissier typedef uint64_t Elf64_Off; 43*9f84b6f2SJerome Forissier typedef int32_t Elf64_Sword; 44*9f84b6f2SJerome Forissier typedef int64_t Elf64_Sxword; 45*9f84b6f2SJerome Forissier typedef uint32_t Elf64_Word; 46*9f84b6f2SJerome Forissier typedef uint64_t Elf64_Lword; 47*9f84b6f2SJerome Forissier typedef uint64_t Elf64_Xword; 48*9f84b6f2SJerome Forissier 49*9f84b6f2SJerome Forissier /* 50*9f84b6f2SJerome Forissier * Types of dynamic symbol hash table bucket and chain elements. 51*9f84b6f2SJerome Forissier * 52*9f84b6f2SJerome Forissier * This is inconsistent among 64 bit architectures, so a machine dependent 53*9f84b6f2SJerome Forissier * typedef is required. 54*9f84b6f2SJerome Forissier */ 55*9f84b6f2SJerome Forissier 56*9f84b6f2SJerome Forissier typedef Elf64_Word Elf64_Hashelt; 57*9f84b6f2SJerome Forissier 58*9f84b6f2SJerome Forissier /* Non-standard class-dependent datatype used for abstraction. */ 59*9f84b6f2SJerome Forissier typedef Elf64_Xword Elf64_Size; 60*9f84b6f2SJerome Forissier typedef Elf64_Sxword Elf64_Ssize; 61*9f84b6f2SJerome Forissier 62*9f84b6f2SJerome Forissier /* 63*9f84b6f2SJerome Forissier * ELF header. 64*9f84b6f2SJerome Forissier */ 65*9f84b6f2SJerome Forissier 66*9f84b6f2SJerome Forissier typedef struct { 67*9f84b6f2SJerome Forissier unsigned char e_ident[EI_NIDENT]; /* File identification. */ 68*9f84b6f2SJerome Forissier Elf64_Half e_type; /* File type. */ 69*9f84b6f2SJerome Forissier Elf64_Half e_machine; /* Machine architecture. */ 70*9f84b6f2SJerome Forissier Elf64_Word e_version; /* ELF format version. */ 71*9f84b6f2SJerome Forissier Elf64_Addr e_entry; /* Entry point. */ 72*9f84b6f2SJerome Forissier Elf64_Off e_phoff; /* Program header file offset. */ 73*9f84b6f2SJerome Forissier Elf64_Off e_shoff; /* Section header file offset. */ 74*9f84b6f2SJerome Forissier Elf64_Word e_flags; /* Architecture-specific flags. */ 75*9f84b6f2SJerome Forissier Elf64_Half e_ehsize; /* Size of ELF header in bytes. */ 76*9f84b6f2SJerome Forissier Elf64_Half e_phentsize; /* Size of program header entry. */ 77*9f84b6f2SJerome Forissier Elf64_Half e_phnum; /* Number of program header entries. */ 78*9f84b6f2SJerome Forissier Elf64_Half e_shentsize; /* Size of section header entry. */ 79*9f84b6f2SJerome Forissier Elf64_Half e_shnum; /* Number of section header entries. */ 80*9f84b6f2SJerome Forissier Elf64_Half e_shstrndx; /* Section name strings section. */ 81*9f84b6f2SJerome Forissier } Elf64_Ehdr; 82*9f84b6f2SJerome Forissier 83*9f84b6f2SJerome Forissier /* 84*9f84b6f2SJerome Forissier * Section header. 85*9f84b6f2SJerome Forissier */ 86*9f84b6f2SJerome Forissier 87*9f84b6f2SJerome Forissier typedef struct { 88*9f84b6f2SJerome Forissier Elf64_Word sh_name; /* Section name (index into the 89*9f84b6f2SJerome Forissier section header string table). */ 90*9f84b6f2SJerome Forissier Elf64_Word sh_type; /* Section type. */ 91*9f84b6f2SJerome Forissier Elf64_Xword sh_flags; /* Section flags. */ 92*9f84b6f2SJerome Forissier Elf64_Addr sh_addr; /* Address in memory image. */ 93*9f84b6f2SJerome Forissier Elf64_Off sh_offset; /* Offset in file. */ 94*9f84b6f2SJerome Forissier Elf64_Xword sh_size; /* Size in bytes. */ 95*9f84b6f2SJerome Forissier Elf64_Word sh_link; /* Index of a related section. */ 96*9f84b6f2SJerome Forissier Elf64_Word sh_info; /* Depends on section type. */ 97*9f84b6f2SJerome Forissier Elf64_Xword sh_addralign; /* Alignment in bytes. */ 98*9f84b6f2SJerome Forissier Elf64_Xword sh_entsize; /* Size of each entry in section. */ 99*9f84b6f2SJerome Forissier } Elf64_Shdr; 100*9f84b6f2SJerome Forissier 101*9f84b6f2SJerome Forissier /* 102*9f84b6f2SJerome Forissier * Program header. 103*9f84b6f2SJerome Forissier */ 104*9f84b6f2SJerome Forissier 105*9f84b6f2SJerome Forissier typedef struct { 106*9f84b6f2SJerome Forissier Elf64_Word p_type; /* Entry type. */ 107*9f84b6f2SJerome Forissier Elf64_Word p_flags; /* Access permission flags. */ 108*9f84b6f2SJerome Forissier Elf64_Off p_offset; /* File offset of contents. */ 109*9f84b6f2SJerome Forissier Elf64_Addr p_vaddr; /* Virtual address in memory image. */ 110*9f84b6f2SJerome Forissier Elf64_Addr p_paddr; /* Physical address (not used). */ 111*9f84b6f2SJerome Forissier Elf64_Xword p_filesz; /* Size of contents in file. */ 112*9f84b6f2SJerome Forissier Elf64_Xword p_memsz; /* Size of contents in memory. */ 113*9f84b6f2SJerome Forissier Elf64_Xword p_align; /* Alignment in memory and file. */ 114*9f84b6f2SJerome Forissier } Elf64_Phdr; 115*9f84b6f2SJerome Forissier 116*9f84b6f2SJerome Forissier /* 117*9f84b6f2SJerome Forissier * Dynamic structure. The ".dynamic" section contains an array of them. 118*9f84b6f2SJerome Forissier */ 119*9f84b6f2SJerome Forissier 120*9f84b6f2SJerome Forissier typedef struct { 121*9f84b6f2SJerome Forissier Elf64_Sxword d_tag; /* Entry type. */ 122*9f84b6f2SJerome Forissier union { 123*9f84b6f2SJerome Forissier Elf64_Xword d_val; /* Integer value. */ 124*9f84b6f2SJerome Forissier Elf64_Addr d_ptr; /* Address value. */ 125*9f84b6f2SJerome Forissier } d_un; 126*9f84b6f2SJerome Forissier } Elf64_Dyn; 127*9f84b6f2SJerome Forissier 128*9f84b6f2SJerome Forissier /* 129*9f84b6f2SJerome Forissier * Relocation entries. 130*9f84b6f2SJerome Forissier */ 131*9f84b6f2SJerome Forissier 132*9f84b6f2SJerome Forissier /* Relocations that don't need an addend field. */ 133*9f84b6f2SJerome Forissier typedef struct { 134*9f84b6f2SJerome Forissier Elf64_Addr r_offset; /* Location to be relocated. */ 135*9f84b6f2SJerome Forissier Elf64_Xword r_info; /* Relocation type and symbol index. */ 136*9f84b6f2SJerome Forissier } Elf64_Rel; 137*9f84b6f2SJerome Forissier 138*9f84b6f2SJerome Forissier /* Relocations that need an addend field. */ 139*9f84b6f2SJerome Forissier typedef struct { 140*9f84b6f2SJerome Forissier Elf64_Addr r_offset; /* Location to be relocated. */ 141*9f84b6f2SJerome Forissier Elf64_Xword r_info; /* Relocation type and symbol index. */ 142*9f84b6f2SJerome Forissier Elf64_Sxword r_addend; /* Addend. */ 143*9f84b6f2SJerome Forissier } Elf64_Rela; 144*9f84b6f2SJerome Forissier 145*9f84b6f2SJerome Forissier /* Macros for accessing the fields of r_info. */ 146*9f84b6f2SJerome Forissier #define ELF64_R_SYM(info) ((info) >> 32) 147*9f84b6f2SJerome Forissier #define ELF64_R_TYPE(info) ((info) & 0xffffffffL) 148*9f84b6f2SJerome Forissier 149*9f84b6f2SJerome Forissier /* Macro for constructing r_info from field values. */ 150*9f84b6f2SJerome Forissier #define ELF64_R_INFO(sym, type) (((sym) << 32) + ((type) & 0xffffffffL)) 151*9f84b6f2SJerome Forissier 152*9f84b6f2SJerome Forissier #define ELF64_R_TYPE_DATA(info) (((Elf64_Xword)(info)<<32)>>40) 153*9f84b6f2SJerome Forissier #define ELF64_R_TYPE_ID(info) (((Elf64_Xword)(info)<<56)>>56) 154*9f84b6f2SJerome Forissier #define ELF64_R_TYPE_INFO(data, type) \ 155*9f84b6f2SJerome Forissier (((Elf64_Xword)(data)<<8)+(Elf64_Xword)(type)) 156*9f84b6f2SJerome Forissier 157*9f84b6f2SJerome Forissier /* 158*9f84b6f2SJerome Forissier * Note entry header 159*9f84b6f2SJerome Forissier */ 160*9f84b6f2SJerome Forissier typedef Elf_Note Elf64_Nhdr; 161*9f84b6f2SJerome Forissier 162*9f84b6f2SJerome Forissier /* 163*9f84b6f2SJerome Forissier * Move entry 164*9f84b6f2SJerome Forissier */ 165*9f84b6f2SJerome Forissier typedef struct { 166*9f84b6f2SJerome Forissier Elf64_Lword m_value; /* symbol value */ 167*9f84b6f2SJerome Forissier Elf64_Xword m_info; /* size + index */ 168*9f84b6f2SJerome Forissier Elf64_Xword m_poffset; /* symbol offset */ 169*9f84b6f2SJerome Forissier Elf64_Half m_repeat; /* repeat count */ 170*9f84b6f2SJerome Forissier Elf64_Half m_stride; /* stride info */ 171*9f84b6f2SJerome Forissier } Elf64_Move; 172*9f84b6f2SJerome Forissier 173*9f84b6f2SJerome Forissier #define ELF64_M_SYM(info) ((info)>>8) 174*9f84b6f2SJerome Forissier #define ELF64_M_SIZE(info) ((unsigned char)(info)) 175*9f84b6f2SJerome Forissier #define ELF64_M_INFO(sym, size) (((sym)<<8)+(unsigned char)(size)) 176*9f84b6f2SJerome Forissier 177*9f84b6f2SJerome Forissier /* 178*9f84b6f2SJerome Forissier * Hardware/Software capabilities entry 179*9f84b6f2SJerome Forissier */ 180*9f84b6f2SJerome Forissier typedef struct { 181*9f84b6f2SJerome Forissier Elf64_Xword c_tag; /* how to interpret value */ 182*9f84b6f2SJerome Forissier union { 183*9f84b6f2SJerome Forissier Elf64_Xword c_val; 184*9f84b6f2SJerome Forissier Elf64_Addr c_ptr; 185*9f84b6f2SJerome Forissier } c_un; 186*9f84b6f2SJerome Forissier } Elf64_Cap; 187*9f84b6f2SJerome Forissier 188*9f84b6f2SJerome Forissier /* 189*9f84b6f2SJerome Forissier * Symbol table entries. 190*9f84b6f2SJerome Forissier */ 191*9f84b6f2SJerome Forissier 192*9f84b6f2SJerome Forissier typedef struct { 193*9f84b6f2SJerome Forissier Elf64_Word st_name; /* String table index of name. */ 194*9f84b6f2SJerome Forissier unsigned char st_info; /* Type and binding information. */ 195*9f84b6f2SJerome Forissier unsigned char st_other; /* Reserved (not used). */ 196*9f84b6f2SJerome Forissier Elf64_Half st_shndx; /* Section index of symbol. */ 197*9f84b6f2SJerome Forissier Elf64_Addr st_value; /* Symbol value. */ 198*9f84b6f2SJerome Forissier Elf64_Xword st_size; /* Size of associated object. */ 199*9f84b6f2SJerome Forissier } Elf64_Sym; 200*9f84b6f2SJerome Forissier 201*9f84b6f2SJerome Forissier /* Macros for accessing the fields of st_info. */ 202*9f84b6f2SJerome Forissier #define ELF64_ST_BIND(info) ((info) >> 4) 203*9f84b6f2SJerome Forissier #define ELF64_ST_TYPE(info) ((info) & 0xf) 204*9f84b6f2SJerome Forissier 205*9f84b6f2SJerome Forissier /* Macro for constructing st_info from field values. */ 206*9f84b6f2SJerome Forissier #define ELF64_ST_INFO(bind, type) (((bind) << 4) + ((type) & 0xf)) 207*9f84b6f2SJerome Forissier 208*9f84b6f2SJerome Forissier /* Macro for accessing the fields of st_other. */ 209*9f84b6f2SJerome Forissier #define ELF64_ST_VISIBILITY(oth) ((oth) & 0x3) 210*9f84b6f2SJerome Forissier 211*9f84b6f2SJerome Forissier /* Structures used by Sun & GNU-style symbol versioning. */ 212*9f84b6f2SJerome Forissier typedef struct { 213*9f84b6f2SJerome Forissier Elf64_Half vd_version; 214*9f84b6f2SJerome Forissier Elf64_Half vd_flags; 215*9f84b6f2SJerome Forissier Elf64_Half vd_ndx; 216*9f84b6f2SJerome Forissier Elf64_Half vd_cnt; 217*9f84b6f2SJerome Forissier Elf64_Word vd_hash; 218*9f84b6f2SJerome Forissier Elf64_Word vd_aux; 219*9f84b6f2SJerome Forissier Elf64_Word vd_next; 220*9f84b6f2SJerome Forissier } Elf64_Verdef; 221*9f84b6f2SJerome Forissier 222*9f84b6f2SJerome Forissier typedef struct { 223*9f84b6f2SJerome Forissier Elf64_Word vda_name; 224*9f84b6f2SJerome Forissier Elf64_Word vda_next; 225*9f84b6f2SJerome Forissier } Elf64_Verdaux; 226*9f84b6f2SJerome Forissier 227*9f84b6f2SJerome Forissier typedef struct { 228*9f84b6f2SJerome Forissier Elf64_Half vn_version; 229*9f84b6f2SJerome Forissier Elf64_Half vn_cnt; 230*9f84b6f2SJerome Forissier Elf64_Word vn_file; 231*9f84b6f2SJerome Forissier Elf64_Word vn_aux; 232*9f84b6f2SJerome Forissier Elf64_Word vn_next; 233*9f84b6f2SJerome Forissier } Elf64_Verneed; 234*9f84b6f2SJerome Forissier 235*9f84b6f2SJerome Forissier typedef struct { 236*9f84b6f2SJerome Forissier Elf64_Word vna_hash; 237*9f84b6f2SJerome Forissier Elf64_Half vna_flags; 238*9f84b6f2SJerome Forissier Elf64_Half vna_other; 239*9f84b6f2SJerome Forissier Elf64_Word vna_name; 240*9f84b6f2SJerome Forissier Elf64_Word vna_next; 241*9f84b6f2SJerome Forissier } Elf64_Vernaux; 242*9f84b6f2SJerome Forissier 243*9f84b6f2SJerome Forissier typedef Elf64_Half Elf64_Versym; 244*9f84b6f2SJerome Forissier 245*9f84b6f2SJerome Forissier typedef struct { 246*9f84b6f2SJerome Forissier Elf64_Half si_boundto; /* direct bindings - symbol bound to */ 247*9f84b6f2SJerome Forissier Elf64_Half si_flags; /* per symbol flags */ 248*9f84b6f2SJerome Forissier } Elf64_Syminfo; 249*9f84b6f2SJerome Forissier 250*9f84b6f2SJerome Forissier #endif /* !_SYS_ELF64_H_ */ 251