1 /* Abstract description of component ELF types. 2 Copyright (C) 1998, 1999, 2000, 2002, 2004, 2007, 2015 Red Hat, Inc. 3 This file is part of elfutils. 4 Written by Ulrich Drepper <drepper@redhat.com>, 1998. 5 6 This file is free software; you can redistribute it and/or modify 7 it under the terms of either 8 9 * the GNU Lesser General Public License as published by the Free 10 Software Foundation; either version 3 of the License, or (at 11 your option) any later version 12 13 or 14 15 * the GNU General Public License as published by the Free 16 Software Foundation; either version 2 of the License, or (at 17 your option) any later version 18 19 or both in parallel, as here. 20 21 elfutils is distributed in the hope that it will be useful, but 22 WITHOUT ANY WARRANTY; without even the implied warranty of 23 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 24 General Public License for more details. 25 26 You should have received copies of the GNU General Public License and 27 the GNU Lesser General Public License along with this program. If 28 not, see <http://www.gnu.org/licenses/>. */ 29 30 /* ELF header. */ 31 #define Ehdr(Bits, Ext) \ 32 START (Bits, Ehdr, Ext##Ehdr) \ 33 TYPE_EXTRA (unsigned char e_ident[EI_NIDENT];) \ 34 TYPE_XLATE (memmove (tdest->e_ident, tsrc->e_ident, EI_NIDENT);) \ 35 TYPE_NAME (ElfW2(Bits, Ext##Half), e_type) \ 36 TYPE_NAME (ElfW2(Bits, Ext##Half), e_machine) \ 37 TYPE_NAME (ElfW2(Bits, Ext##Word), e_version) \ 38 TYPE_NAME (ElfW2(Bits, Ext##Addr), e_entry) \ 39 TYPE_NAME (ElfW2(Bits, Ext##Off), e_phoff) \ 40 TYPE_NAME (ElfW2(Bits, Ext##Off), e_shoff) \ 41 TYPE_NAME (ElfW2(Bits, Ext##Word), e_flags) \ 42 TYPE_NAME (ElfW2(Bits, Ext##Half), e_ehsize) \ 43 TYPE_NAME (ElfW2(Bits, Ext##Half), e_phentsize) \ 44 TYPE_NAME (ElfW2(Bits, Ext##Half), e_phnum) \ 45 TYPE_NAME (ElfW2(Bits, Ext##Half), e_shentsize) \ 46 TYPE_NAME (ElfW2(Bits, Ext##Half), e_shnum) \ 47 TYPE_NAME (ElfW2(Bits, Ext##Half), e_shstrndx) \ 48 END (Bits, Ext##Ehdr) 49 50 #define Ehdr32(Ext) \ 51 Ehdr(32, Ext) 52 #define Ehdr64(Ext) \ 53 Ehdr(64, Ext) 54 55 56 /* Program header. */ 57 #define Phdr32(Ext) \ 58 START (32, Phdr, Ext##Phdr) \ 59 TYPE_NAME (ElfW2(32, Ext##Word), p_type) \ 60 TYPE_NAME (ElfW2(32, Ext##Off), p_offset) \ 61 TYPE_NAME (ElfW2(32, Ext##Addr), p_vaddr) \ 62 TYPE_NAME (ElfW2(32, Ext##Addr), p_paddr) \ 63 TYPE_NAME (ElfW2(32, Ext##Word), p_filesz) \ 64 TYPE_NAME (ElfW2(32, Ext##Word), p_memsz) \ 65 TYPE_NAME (ElfW2(32, Ext##Word), p_flags) \ 66 TYPE_NAME (ElfW2(32, Ext##Word), p_align) \ 67 END (32, Ext##Phdr) 68 #define Phdr64(Ext) \ 69 START (64, Phdr, Ext##Phdr) \ 70 TYPE_NAME (ElfW2(64, Ext##Word), p_type) \ 71 TYPE_NAME (ElfW2(64, Ext##Word), p_flags) \ 72 TYPE_NAME (ElfW2(64, Ext##Off), p_offset) \ 73 TYPE_NAME (ElfW2(64, Ext##Addr), p_vaddr) \ 74 TYPE_NAME (ElfW2(64, Ext##Addr), p_paddr) \ 75 TYPE_NAME (ElfW2(64, Ext##Xword), p_filesz) \ 76 TYPE_NAME (ElfW2(64, Ext##Xword), p_memsz) \ 77 TYPE_NAME (ElfW2(64, Ext##Xword), p_align) \ 78 END (64, Ext##Phdr) 79 80 81 /* Section header. */ 82 #define Shdr32(Ext) \ 83 START (32, Shdr, Ext##Shdr) \ 84 TYPE_NAME (ElfW2(32, Ext##Word), sh_name) \ 85 TYPE_NAME (ElfW2(32, Ext##Word), sh_type) \ 86 TYPE_NAME (ElfW2(32, Ext##Word), sh_flags) \ 87 TYPE_NAME (ElfW2(32, Ext##Addr), sh_addr) \ 88 TYPE_NAME (ElfW2(32, Ext##Off), sh_offset) \ 89 TYPE_NAME (ElfW2(32, Ext##Word), sh_size) \ 90 TYPE_NAME (ElfW2(32, Ext##Word), sh_link) \ 91 TYPE_NAME (ElfW2(32, Ext##Word), sh_info) \ 92 TYPE_NAME (ElfW2(32, Ext##Word), sh_addralign) \ 93 TYPE_NAME (ElfW2(32, Ext##Word), sh_entsize) \ 94 END (32, Ext##Shdr) 95 #define Shdr64(Ext) \ 96 START (64, Shdr, Ext##Shdr) \ 97 TYPE_NAME (ElfW2(64, Ext##Word), sh_name) \ 98 TYPE_NAME (ElfW2(64, Ext##Word), sh_type) \ 99 TYPE_NAME (ElfW2(64, Ext##Xword), sh_flags) \ 100 TYPE_NAME (ElfW2(64, Ext##Addr), sh_addr) \ 101 TYPE_NAME (ElfW2(64, Ext##Off), sh_offset) \ 102 TYPE_NAME (ElfW2(64, Ext##Xword), sh_size) \ 103 TYPE_NAME (ElfW2(64, Ext##Word), sh_link) \ 104 TYPE_NAME (ElfW2(64, Ext##Word), sh_info) \ 105 TYPE_NAME (ElfW2(64, Ext##Xword), sh_addralign) \ 106 TYPE_NAME (ElfW2(64, Ext##Xword), sh_entsize) \ 107 END (64, Ext##Shdr) 108 109 110 /* Symbol table. */ 111 #define Sym32(Ext) \ 112 START (32, Sym, Ext##Sym) \ 113 TYPE_NAME (ElfW2(32, Ext##Word), st_name) \ 114 TYPE_NAME (ElfW2(32, Ext##Addr), st_value) \ 115 TYPE_NAME (ElfW2(32, Ext##Word), st_size) \ 116 TYPE_EXTRA (unsigned char st_info;) \ 117 TYPE_XLATE (tdest->st_info = tsrc->st_info;) \ 118 TYPE_EXTRA (unsigned char st_other;) \ 119 TYPE_XLATE (tdest->st_other = tsrc->st_other;) \ 120 TYPE_NAME (ElfW2(32, Ext##Half), st_shndx) \ 121 END (32, Ext##Sym) 122 #define Sym64(Ext) \ 123 START (64, Sym, Ext##Sym) \ 124 TYPE_NAME (ElfW2(64, Ext##Word), st_name) \ 125 TYPE_EXTRA (unsigned char st_info;) \ 126 TYPE_XLATE (tdest->st_info = tsrc->st_info;) \ 127 TYPE_EXTRA (unsigned char st_other;) \ 128 TYPE_XLATE (tdest->st_other = tsrc->st_other;) \ 129 TYPE_NAME (ElfW2(64, Ext##Half), st_shndx) \ 130 TYPE_NAME (ElfW2(64, Ext##Addr), st_value) \ 131 TYPE_NAME (ElfW2(64, Ext##Xword), st_size) \ 132 END (64, Ext##Sym) 133 134 135 /* Relocation. */ 136 #define Rel32(Ext) \ 137 START (32, Rel, Ext##Rel) \ 138 TYPE_NAME (ElfW2(32, Ext##Addr), r_offset) \ 139 TYPE_NAME (ElfW2(32, Ext##Word), r_info) \ 140 END (32, Ext##Rel) 141 #define Rel64(Ext) \ 142 START (64, Rel, Ext##Rel) \ 143 TYPE_NAME (ElfW2(64, Ext##Addr), r_offset) \ 144 TYPE_NAME (ElfW2(64, Ext##Xword), r_info) \ 145 END (64, Ext##Rel) 146 147 #define Rela32(Ext) \ 148 START (32, Rela, Ext##Rela) \ 149 TYPE_NAME (ElfW2(32, Ext##Addr), r_offset) \ 150 TYPE_NAME (ElfW2(32, Ext##Word), r_info) \ 151 TYPE_NAME (ElfW2(32, Ext##Sword), r_addend) \ 152 END (32, Ext##Rela) 153 #define Rela64(Ext) \ 154 START (64, Rela, Ext##Rela) \ 155 TYPE_NAME (ElfW2(64, Ext##Addr), r_offset) \ 156 TYPE_NAME (ElfW2(64, Ext##Xword), r_info) \ 157 TYPE_NAME (ElfW2(64, Ext##Sxword), r_addend) \ 158 END (64, Ext##Rela) 159 160 161 /* Note entry header. */ 162 #define Note(Bits, Ext) \ 163 START (Bits, Nhdr, Ext##Nhdr) \ 164 TYPE_NAME (ElfW2(Bits, Ext##Word), n_namesz) \ 165 TYPE_NAME (ElfW2(Bits, Ext##Word), n_descsz) \ 166 TYPE_NAME (ElfW2(Bits, Ext##Word), n_type) \ 167 END (Bits, Ext##Nhdr) 168 169 #define Note32(Ext) \ 170 Note (32, Ext) 171 #define Note64(Ext) \ 172 Note (64, Ext) 173 174 175 /* Dynamic section data. */ 176 #define Dyn32(Ext) \ 177 START (32, Dyn, Ext##Dyn) \ 178 TYPE_NAME (ElfW2(32, Ext##Sword), d_tag) \ 179 TYPE_EXTRA (union {) \ 180 TYPE_EXTRA (ElfW2(32, Ext##Word) d_val;) \ 181 TYPE_EXTRA (ElfW2(32, Ext##Addr) d_ptr;) \ 182 TYPE_XLATE (Elf32_cvt_Addr1 (&tdest->d_un.d_val, &tsrc->d_un.d_val);) \ 183 TYPE_EXTRA (ElfW2(32, Ext##Off) d_off;) \ 184 TYPE_EXTRA (} d_un;) \ 185 END (32, Ext##Dyn) 186 #define Dyn64(Ext) \ 187 START (64, Dyn, Ext##Dyn) \ 188 TYPE_NAME (ElfW2(64, Ext##Xword), d_tag) \ 189 TYPE_EXTRA (union {) \ 190 TYPE_EXTRA (ElfW2(64, Ext##Xword) d_val;) \ 191 TYPE_EXTRA (ElfW2(64, Ext##Addr) d_ptr;) \ 192 TYPE_XLATE (Elf64_cvt_Addr1 (&tdest->d_un.d_val, &tsrc->d_un.d_val);) \ 193 TYPE_EXTRA (} d_un;) \ 194 END (64, Ext##Dyn) 195 196 197 #ifndef GENERATE_CONVERSION 198 /* Version definitions. */ 199 # define Verdef(Bits, Ext) \ 200 START (Bits, Verdef, Ext##Verdef) \ 201 TYPE_NAME (ElfW2(Bits, Ext##Half), vd_version) \ 202 TYPE_NAME (ElfW2(Bits, Ext##Half), vd_flags) \ 203 TYPE_NAME (ElfW2(Bits, Ext##Half), vd_ndx) \ 204 TYPE_NAME (ElfW2(Bits, Ext##Half), vd_cnt) \ 205 TYPE_NAME (ElfW2(Bits, Ext##Word), vd_hash) \ 206 TYPE_NAME (ElfW2(Bits, Ext##Word), vd_aux) \ 207 TYPE_NAME (ElfW2(Bits, Ext##Word), vd_next) \ 208 END (Bits, Ext##Verdef) 209 210 # define Verdef32(Ext) \ 211 Verdef (32, Ext) 212 # define Verdef64(Ext) \ 213 Verdef (64, Ext) 214 215 # define Verdaux(Bits, Ext) \ 216 START (Bits, Verdaux, Ext##Verdaux) \ 217 TYPE_NAME (ElfW2(Bits, Ext##Word), vda_name) \ 218 TYPE_NAME (ElfW2(Bits, Ext##Word), vda_next) \ 219 END (Bits, Ext##Verdaux) 220 221 # define Verdaux32(Ext) \ 222 Verdaux (32, Ext) 223 # define Verdaux64(Ext) \ 224 Verdaux (64, Ext) 225 226 /* Required versions. */ 227 # define Verneed(Bits, Ext) \ 228 START (Bits, Verneed, Ext##Verneed) \ 229 TYPE_NAME (ElfW2(Bits, Ext##Half), vn_version) \ 230 TYPE_NAME (ElfW2(Bits, Ext##Half), vn_cnt) \ 231 TYPE_NAME (ElfW2(Bits, Ext##Word), vn_file) \ 232 TYPE_NAME (ElfW2(Bits, Ext##Word), vn_aux) \ 233 TYPE_NAME (ElfW2(Bits, Ext##Word), vn_next) \ 234 END (Bits, Ext##Verneed) 235 236 # define Verneed32(Ext) \ 237 Verneed (32, Ext) 238 # define Verneed64(Ext) \ 239 Verneed (64, Ext) 240 241 # define Vernaux(Bits, Ext) \ 242 START (Bits, Vernaux, Ext##Vernaux) \ 243 TYPE_NAME (ElfW2(Bits, Ext##Word), vna_hash) \ 244 TYPE_NAME (ElfW2(Bits, Ext##Half), vna_flags) \ 245 TYPE_NAME (ElfW2(Bits, Ext##Half), vna_other) \ 246 TYPE_NAME (ElfW2(Bits, Ext##Word), vna_name) \ 247 TYPE_NAME (ElfW2(Bits, Ext##Word), vna_next) \ 248 END (Bits, Ext##Vernaux) 249 250 # define Vernaux32(Ext) \ 251 Vernaux (32, Ext) 252 # define Vernaux64(Ext) \ 253 Vernaux (64, Ext) 254 #endif 255 256 /* Symbol information. */ 257 #define Syminfo(Bits, Ext) \ 258 START (Bits, Syminfo, Ext##Syminfo) \ 259 TYPE_NAME (ElfW2(Bits, Ext##Half), si_boundto) \ 260 TYPE_NAME (ElfW2(Bits, Ext##Half), si_flags) \ 261 END (Bits, Ext##Syminfo) 262 263 #define Syminfo32(Ext) \ 264 Syminfo (32, Ext) 265 #define Syminfo64(Ext) \ 266 Syminfo (64, Ext) 267 268 /* Move information. */ 269 #define Move(Bits, Ext) \ 270 START (Bits, Move, Ext##Move) \ 271 TYPE_NAME (ElfW2(Bits, Ext##Xword), m_value) \ 272 TYPE_NAME (ElfW2(Bits, Ext##Xword), m_info) \ 273 TYPE_NAME (ElfW2(Bits, Ext##Xword), m_poffset) \ 274 TYPE_NAME (ElfW2(Bits, Ext##Half), m_repeat) \ 275 TYPE_NAME (ElfW2(Bits, Ext##Half), m_stride) \ 276 END (Bits, Ext##Move) 277 278 #define Move32(Ext) \ 279 Move (32, Ext) 280 #define Move64(Ext) \ 281 Move (64, Ext) 282 283 #define Lib(Bits, Ext) \ 284 START (Bits, Lib, Ext##Lib) \ 285 TYPE_NAME (ElfW2(Bits, Ext##Word), l_name) \ 286 TYPE_NAME (ElfW2(Bits, Ext##Word), l_time_stamp) \ 287 TYPE_NAME (ElfW2(Bits, Ext##Word), l_checksum) \ 288 TYPE_NAME (ElfW2(Bits, Ext##Word), l_version) \ 289 TYPE_NAME (ElfW2(Bits, Ext##Word), l_flags) \ 290 END (Bits, Ext##Lib) 291 292 #define Lib32(Ext) \ 293 Lib (32, Ext) 294 #define Lib64(Ext) \ 295 Lib (64, Ext) 296 297 #define auxv_t32(Ext) \ 298 START (32, auxv_t, Ext##auxv_t) \ 299 TYPE_NAME (ElfW2(32, Ext##Word), a_type) \ 300 TYPE_EXTRA (union {) \ 301 TYPE_EXTRA (ElfW2(32, Ext##Word) a_val;) \ 302 TYPE_XLATE (Elf32_cvt_Addr1 (&tdest->a_un.a_val, &tsrc->a_un.a_val);) \ 303 TYPE_EXTRA (} a_un;) \ 304 END (32, Ext##auxv_t) 305 #define auxv_t64(Ext) \ 306 START (64, auxv_t, Ext##auxv_t) \ 307 TYPE_NAME (ElfW2(64, Ext##Xword), a_type) \ 308 TYPE_EXTRA (union {) \ 309 TYPE_EXTRA (ElfW2(64, Ext##Xword) a_val;) \ 310 TYPE_XLATE (Elf64_cvt_Addr1 (&tdest->a_un.a_val, &tsrc->a_un.a_val);) \ 311 TYPE_EXTRA (} a_un;) \ 312 END (64, Ext##auxv_t) 313 314 /* Note that there is actual compression data right after the Chdr. 315 So we also have a separate conversion function for the whole 316 section. */ 317 #define Chdr32(Ext) \ 318 START (32, Chdr, Ext##Chdr) \ 319 TYPE_NAME (ElfW2(32, Ext##Word), ch_type) \ 320 TYPE_NAME (ElfW2(32, Ext##Word), ch_size) \ 321 TYPE_NAME (ElfW2(32, Ext##Word), ch_addralign) \ 322 END (32, Ext##Chdr) 323 324 #define Chdr64(Ext) \ 325 START (64, Chdr, Ext##Chdr) \ 326 TYPE_NAME (ElfW2(64, Ext##Word), ch_type) \ 327 TYPE_NAME (ElfW2(64, Ext##Word), ch_reserved) \ 328 TYPE_NAME (ElfW2(64, Ext##Xword), ch_size) \ 329 TYPE_NAME (ElfW2(64, Ext##Xword), ch_addralign) \ 330 END (64, Ext##Chdr) 331