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_ELF32_H_ 31*9f84b6f2SJerome Forissier #define _SYS_ELF32_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 32-bit architectures. 38*9f84b6f2SJerome Forissier */ 39*9f84b6f2SJerome Forissier 40*9f84b6f2SJerome Forissier typedef uint32_t Elf32_Addr; 41*9f84b6f2SJerome Forissier typedef uint16_t Elf32_Half; 42*9f84b6f2SJerome Forissier typedef uint32_t Elf32_Off; 43*9f84b6f2SJerome Forissier typedef int32_t Elf32_Sword; 44*9f84b6f2SJerome Forissier typedef uint32_t Elf32_Word; 45*9f84b6f2SJerome Forissier typedef uint64_t Elf32_Lword; 46*9f84b6f2SJerome Forissier 47*9f84b6f2SJerome Forissier typedef Elf32_Word Elf32_Hashelt; 48*9f84b6f2SJerome Forissier 49*9f84b6f2SJerome Forissier /* Non-standard class-dependent datatype used for abstraction. */ 50*9f84b6f2SJerome Forissier typedef Elf32_Word Elf32_Size; 51*9f84b6f2SJerome Forissier typedef Elf32_Sword Elf32_Ssize; 52*9f84b6f2SJerome Forissier 53*9f84b6f2SJerome Forissier /* 54*9f84b6f2SJerome Forissier * ELF header. 55*9f84b6f2SJerome Forissier */ 56*9f84b6f2SJerome Forissier 57*9f84b6f2SJerome Forissier typedef struct { 58*9f84b6f2SJerome Forissier unsigned char e_ident[EI_NIDENT]; /* File identification. */ 59*9f84b6f2SJerome Forissier Elf32_Half e_type; /* File type. */ 60*9f84b6f2SJerome Forissier Elf32_Half e_machine; /* Machine architecture. */ 61*9f84b6f2SJerome Forissier Elf32_Word e_version; /* ELF format version. */ 62*9f84b6f2SJerome Forissier Elf32_Addr e_entry; /* Entry point. */ 63*9f84b6f2SJerome Forissier Elf32_Off e_phoff; /* Program header file offset. */ 64*9f84b6f2SJerome Forissier Elf32_Off e_shoff; /* Section header file offset. */ 65*9f84b6f2SJerome Forissier Elf32_Word e_flags; /* Architecture-specific flags. */ 66*9f84b6f2SJerome Forissier Elf32_Half e_ehsize; /* Size of ELF header in bytes. */ 67*9f84b6f2SJerome Forissier Elf32_Half e_phentsize; /* Size of program header entry. */ 68*9f84b6f2SJerome Forissier Elf32_Half e_phnum; /* Number of program header entries. */ 69*9f84b6f2SJerome Forissier Elf32_Half e_shentsize; /* Size of section header entry. */ 70*9f84b6f2SJerome Forissier Elf32_Half e_shnum; /* Number of section header entries. */ 71*9f84b6f2SJerome Forissier Elf32_Half e_shstrndx; /* Section name strings section. */ 72*9f84b6f2SJerome Forissier } Elf32_Ehdr; 73*9f84b6f2SJerome Forissier 74*9f84b6f2SJerome Forissier /* 75*9f84b6f2SJerome Forissier * Section header. 76*9f84b6f2SJerome Forissier */ 77*9f84b6f2SJerome Forissier 78*9f84b6f2SJerome Forissier typedef struct { 79*9f84b6f2SJerome Forissier Elf32_Word sh_name; /* Section name (index into the 80*9f84b6f2SJerome Forissier section header string table). */ 81*9f84b6f2SJerome Forissier Elf32_Word sh_type; /* Section type. */ 82*9f84b6f2SJerome Forissier Elf32_Word sh_flags; /* Section flags. */ 83*9f84b6f2SJerome Forissier Elf32_Addr sh_addr; /* Address in memory image. */ 84*9f84b6f2SJerome Forissier Elf32_Off sh_offset; /* Offset in file. */ 85*9f84b6f2SJerome Forissier Elf32_Word sh_size; /* Size in bytes. */ 86*9f84b6f2SJerome Forissier Elf32_Word sh_link; /* Index of a related section. */ 87*9f84b6f2SJerome Forissier Elf32_Word sh_info; /* Depends on section type. */ 88*9f84b6f2SJerome Forissier Elf32_Word sh_addralign; /* Alignment in bytes. */ 89*9f84b6f2SJerome Forissier Elf32_Word sh_entsize; /* Size of each entry in section. */ 90*9f84b6f2SJerome Forissier } Elf32_Shdr; 91*9f84b6f2SJerome Forissier 92*9f84b6f2SJerome Forissier /* 93*9f84b6f2SJerome Forissier * Program header. 94*9f84b6f2SJerome Forissier */ 95*9f84b6f2SJerome Forissier 96*9f84b6f2SJerome Forissier typedef struct { 97*9f84b6f2SJerome Forissier Elf32_Word p_type; /* Entry type. */ 98*9f84b6f2SJerome Forissier Elf32_Off p_offset; /* File offset of contents. */ 99*9f84b6f2SJerome Forissier Elf32_Addr p_vaddr; /* Virtual address in memory image. */ 100*9f84b6f2SJerome Forissier Elf32_Addr p_paddr; /* Physical address (not used). */ 101*9f84b6f2SJerome Forissier Elf32_Word p_filesz; /* Size of contents in file. */ 102*9f84b6f2SJerome Forissier Elf32_Word p_memsz; /* Size of contents in memory. */ 103*9f84b6f2SJerome Forissier Elf32_Word p_flags; /* Access permission flags. */ 104*9f84b6f2SJerome Forissier Elf32_Word p_align; /* Alignment in memory and file. */ 105*9f84b6f2SJerome Forissier } Elf32_Phdr; 106*9f84b6f2SJerome Forissier 107*9f84b6f2SJerome Forissier /* 108*9f84b6f2SJerome Forissier * Dynamic structure. The ".dynamic" section contains an array of them. 109*9f84b6f2SJerome Forissier */ 110*9f84b6f2SJerome Forissier 111*9f84b6f2SJerome Forissier typedef struct { 112*9f84b6f2SJerome Forissier Elf32_Sword d_tag; /* Entry type. */ 113*9f84b6f2SJerome Forissier union { 114*9f84b6f2SJerome Forissier Elf32_Word d_val; /* Integer value. */ 115*9f84b6f2SJerome Forissier Elf32_Addr d_ptr; /* Address value. */ 116*9f84b6f2SJerome Forissier } d_un; 117*9f84b6f2SJerome Forissier } Elf32_Dyn; 118*9f84b6f2SJerome Forissier 119*9f84b6f2SJerome Forissier /* 120*9f84b6f2SJerome Forissier * Relocation entries. 121*9f84b6f2SJerome Forissier */ 122*9f84b6f2SJerome Forissier 123*9f84b6f2SJerome Forissier /* Relocations that don't need an addend field. */ 124*9f84b6f2SJerome Forissier typedef struct { 125*9f84b6f2SJerome Forissier Elf32_Addr r_offset; /* Location to be relocated. */ 126*9f84b6f2SJerome Forissier Elf32_Word r_info; /* Relocation type and symbol index. */ 127*9f84b6f2SJerome Forissier } Elf32_Rel; 128*9f84b6f2SJerome Forissier 129*9f84b6f2SJerome Forissier /* Relocations that need an addend field. */ 130*9f84b6f2SJerome Forissier typedef struct { 131*9f84b6f2SJerome Forissier Elf32_Addr r_offset; /* Location to be relocated. */ 132*9f84b6f2SJerome Forissier Elf32_Word r_info; /* Relocation type and symbol index. */ 133*9f84b6f2SJerome Forissier Elf32_Sword r_addend; /* Addend. */ 134*9f84b6f2SJerome Forissier } Elf32_Rela; 135*9f84b6f2SJerome Forissier 136*9f84b6f2SJerome Forissier /* Macros for accessing the fields of r_info. */ 137*9f84b6f2SJerome Forissier #define ELF32_R_SYM(info) ((info) >> 8) 138*9f84b6f2SJerome Forissier #define ELF32_R_TYPE(info) ((unsigned char)(info)) 139*9f84b6f2SJerome Forissier 140*9f84b6f2SJerome Forissier /* Macro for constructing r_info from field values. */ 141*9f84b6f2SJerome Forissier #define ELF32_R_INFO(sym, type) (((sym) << 8) + (unsigned char)(type)) 142*9f84b6f2SJerome Forissier 143*9f84b6f2SJerome Forissier /* 144*9f84b6f2SJerome Forissier * Note entry header 145*9f84b6f2SJerome Forissier */ 146*9f84b6f2SJerome Forissier typedef Elf_Note Elf32_Nhdr; 147*9f84b6f2SJerome Forissier 148*9f84b6f2SJerome Forissier /* 149*9f84b6f2SJerome Forissier * Move entry 150*9f84b6f2SJerome Forissier */ 151*9f84b6f2SJerome Forissier typedef struct { 152*9f84b6f2SJerome Forissier Elf32_Lword m_value; /* symbol value */ 153*9f84b6f2SJerome Forissier Elf32_Word m_info; /* size + index */ 154*9f84b6f2SJerome Forissier Elf32_Word m_poffset; /* symbol offset */ 155*9f84b6f2SJerome Forissier Elf32_Half m_repeat; /* repeat count */ 156*9f84b6f2SJerome Forissier Elf32_Half m_stride; /* stride info */ 157*9f84b6f2SJerome Forissier } Elf32_Move; 158*9f84b6f2SJerome Forissier 159*9f84b6f2SJerome Forissier /* 160*9f84b6f2SJerome Forissier * The macros compose and decompose values for Move.r_info 161*9f84b6f2SJerome Forissier * 162*9f84b6f2SJerome Forissier * sym = ELF32_M_SYM(M.m_info) 163*9f84b6f2SJerome Forissier * size = ELF32_M_SIZE(M.m_info) 164*9f84b6f2SJerome Forissier * M.m_info = ELF32_M_INFO(sym, size) 165*9f84b6f2SJerome Forissier */ 166*9f84b6f2SJerome Forissier #define ELF32_M_SYM(info) ((info)>>8) 167*9f84b6f2SJerome Forissier #define ELF32_M_SIZE(info) ((unsigned char)(info)) 168*9f84b6f2SJerome Forissier #define ELF32_M_INFO(sym, size) (((sym)<<8)+(unsigned char)(size)) 169*9f84b6f2SJerome Forissier 170*9f84b6f2SJerome Forissier /* 171*9f84b6f2SJerome Forissier * Hardware/Software capabilities entry 172*9f84b6f2SJerome Forissier */ 173*9f84b6f2SJerome Forissier typedef struct { 174*9f84b6f2SJerome Forissier Elf32_Word c_tag; /* how to interpret value */ 175*9f84b6f2SJerome Forissier union { 176*9f84b6f2SJerome Forissier Elf32_Word c_val; 177*9f84b6f2SJerome Forissier Elf32_Addr c_ptr; 178*9f84b6f2SJerome Forissier } c_un; 179*9f84b6f2SJerome Forissier } Elf32_Cap; 180*9f84b6f2SJerome Forissier 181*9f84b6f2SJerome Forissier /* 182*9f84b6f2SJerome Forissier * Symbol table entries. 183*9f84b6f2SJerome Forissier */ 184*9f84b6f2SJerome Forissier 185*9f84b6f2SJerome Forissier typedef struct { 186*9f84b6f2SJerome Forissier Elf32_Word st_name; /* String table index of name. */ 187*9f84b6f2SJerome Forissier Elf32_Addr st_value; /* Symbol value. */ 188*9f84b6f2SJerome Forissier Elf32_Word st_size; /* Size of associated object. */ 189*9f84b6f2SJerome Forissier unsigned char st_info; /* Type and binding information. */ 190*9f84b6f2SJerome Forissier unsigned char st_other; /* Reserved (not used). */ 191*9f84b6f2SJerome Forissier Elf32_Half st_shndx; /* Section index of symbol. */ 192*9f84b6f2SJerome Forissier } Elf32_Sym; 193*9f84b6f2SJerome Forissier 194*9f84b6f2SJerome Forissier /* Macros for accessing the fields of st_info. */ 195*9f84b6f2SJerome Forissier #define ELF32_ST_BIND(info) ((info) >> 4) 196*9f84b6f2SJerome Forissier #define ELF32_ST_TYPE(info) ((info) & 0xf) 197*9f84b6f2SJerome Forissier 198*9f84b6f2SJerome Forissier /* Macro for constructing st_info from field values. */ 199*9f84b6f2SJerome Forissier #define ELF32_ST_INFO(bind, type) (((bind) << 4) + ((type) & 0xf)) 200*9f84b6f2SJerome Forissier 201*9f84b6f2SJerome Forissier /* Macro for accessing the fields of st_other. */ 202*9f84b6f2SJerome Forissier #define ELF32_ST_VISIBILITY(oth) ((oth) & 0x3) 203*9f84b6f2SJerome Forissier 204*9f84b6f2SJerome Forissier /* Structures used by Sun & GNU symbol versioning. */ 205*9f84b6f2SJerome Forissier typedef struct 206*9f84b6f2SJerome Forissier { 207*9f84b6f2SJerome Forissier Elf32_Half vd_version; 208*9f84b6f2SJerome Forissier Elf32_Half vd_flags; 209*9f84b6f2SJerome Forissier Elf32_Half vd_ndx; 210*9f84b6f2SJerome Forissier Elf32_Half vd_cnt; 211*9f84b6f2SJerome Forissier Elf32_Word vd_hash; 212*9f84b6f2SJerome Forissier Elf32_Word vd_aux; 213*9f84b6f2SJerome Forissier Elf32_Word vd_next; 214*9f84b6f2SJerome Forissier } Elf32_Verdef; 215*9f84b6f2SJerome Forissier 216*9f84b6f2SJerome Forissier typedef struct 217*9f84b6f2SJerome Forissier { 218*9f84b6f2SJerome Forissier Elf32_Word vda_name; 219*9f84b6f2SJerome Forissier Elf32_Word vda_next; 220*9f84b6f2SJerome Forissier } Elf32_Verdaux; 221*9f84b6f2SJerome Forissier 222*9f84b6f2SJerome Forissier typedef struct 223*9f84b6f2SJerome Forissier { 224*9f84b6f2SJerome Forissier Elf32_Half vn_version; 225*9f84b6f2SJerome Forissier Elf32_Half vn_cnt; 226*9f84b6f2SJerome Forissier Elf32_Word vn_file; 227*9f84b6f2SJerome Forissier Elf32_Word vn_aux; 228*9f84b6f2SJerome Forissier Elf32_Word vn_next; 229*9f84b6f2SJerome Forissier } Elf32_Verneed; 230*9f84b6f2SJerome Forissier 231*9f84b6f2SJerome Forissier typedef struct 232*9f84b6f2SJerome Forissier { 233*9f84b6f2SJerome Forissier Elf32_Word vna_hash; 234*9f84b6f2SJerome Forissier Elf32_Half vna_flags; 235*9f84b6f2SJerome Forissier Elf32_Half vna_other; 236*9f84b6f2SJerome Forissier Elf32_Word vna_name; 237*9f84b6f2SJerome Forissier Elf32_Word vna_next; 238*9f84b6f2SJerome Forissier } Elf32_Vernaux; 239*9f84b6f2SJerome Forissier 240*9f84b6f2SJerome Forissier typedef Elf32_Half Elf32_Versym; 241*9f84b6f2SJerome Forissier 242*9f84b6f2SJerome Forissier typedef struct { 243*9f84b6f2SJerome Forissier Elf32_Half si_boundto; /* direct bindings - symbol bound to */ 244*9f84b6f2SJerome Forissier Elf32_Half si_flags; /* per symbol flags */ 245*9f84b6f2SJerome Forissier } Elf32_Syminfo; 246*9f84b6f2SJerome Forissier 247*9f84b6f2SJerome Forissier #endif /* !_SYS_ELF32_H_ */ 248