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