1/* $NetBSD: elf_types.m4,v 1.2 2014/03/09 16:58:04 christos Exp $ */ 2 3/*- 4 * Copyright (c) 2006,2008 Joseph Koshy 5 * All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: 10 * 1. Redistributions of source code must retain the above copyright 11 * notice, this list of conditions and the following disclaimer. 12 * 2. Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 17 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 20 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 21 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 22 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 23 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 24 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 25 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26 * SUCH DAMAGE. 27 * 28 * Id: elf_types.m4 321 2009-03-07 16:59:14Z jkoshy 29 */ 30 31/* 32 * ELF types, defined in the "enum Elf_Type" API. 33 * 34 * The members of the list form a 2-tuple: (name, C-type-suffix). 35 * + `name' is an Elf_Type symbol without the `ELF_T_' prefix. 36 * + `C-type-suffix' is the suffix for Elf32_ and Elf64_ type names. 37 */ 38 39define(`ELF_TYPE_LIST', 40 ``ADDR, Addr', 41 `BYTE, Byte', 42 `CAP, Cap', 43 `DYN, Dyn', 44 `EHDR, Ehdr', 45 `GNUHASH, -', 46 `HALF, Half', 47 `LWORD, Lword', 48 `MOVE, Move', 49 `MOVEP, MoveP', 50 `NOTE, Note', 51 `OFF, Off', 52 `PHDR, Phdr', 53 `REL, Rel', 54 `RELA, Rela', 55 `SHDR, Shdr', 56 `SWORD, Sword', 57 `SXWORD, Sxword', 58 `SYMINFO, Syminfo', 59 `SYM, Sym', 60 `VDEF, Verdef', 61 `VNEED, Verneed', 62 `WORD, Word', 63 `XWORD, Xword', 64 `NUM, _'') 65 66/* 67 * DEFINE_STRUCT(NAME,MEMBERLIST...) 68 * 69 * Map a type name to its members. 70 * 71 * Each member-list element comprises of pairs of (field name, type), 72 * in the sequence used in the file representation of `NAME'. 73 * 74 * Each member list element comprises a pair containing a field name 75 * and a basic type. Basic types include IDENT, HALF, WORD, LWORD, 76 * ADDR{32,64}, OFF{32,64}, SWORD, XWORD, SXWORD. 77 * 78 * The last element of a member list is the null element: `_,_'. 79 */ 80 81define(`DEFINE_STRUCT',`define(`$1_DEF',shift($@))dnl') 82 83DEFINE_STRUCT(`Elf32_Cap', 84 ``c_tag, WORD', 85 `c_un.c_val, WORD', 86 `_,_'') 87 88DEFINE_STRUCT(`Elf64_Cap', 89 ``c_tag, XWORD', 90 `c_un.c_val, XWORD', 91 `_,_'') 92 93DEFINE_STRUCT(`Elf32_Dyn', 94 ``d_tag, SWORD', 95 `d_un.d_ptr, WORD', 96 `_,_'') 97 98DEFINE_STRUCT(`Elf64_Dyn', 99 ``d_tag, SXWORD', 100 `d_un.d_ptr, XWORD', 101 `_,_'') 102 103DEFINE_STRUCT(`Elf32_Ehdr', 104 ``e_ident, IDENT', 105 `e_type, HALF', 106 `e_machine, HALF', 107 `e_version, WORD', 108 `e_entry, ADDR', 109 `e_phoff, OFF', 110 `e_shoff, OFF', 111 `e_flags, WORD', 112 `e_ehsize, HALF', 113 `e_phentsize, HALF', 114 `e_phnum, HALF', 115 `e_shentsize, HALF', 116 `e_shnum, HALF', 117 `e_shstrndx, HALF', 118 `_,_'') 119 120DEFINE_STRUCT(`Elf64_Ehdr', 121 ``e_ident, IDENT', 122 `e_type, HALF', 123 `e_machine, HALF', 124 `e_version, WORD', 125 `e_entry, ADDR', 126 `e_phoff, OFF', 127 `e_shoff, OFF', 128 `e_flags, WORD', 129 `e_ehsize, HALF', 130 `e_phentsize, HALF', 131 `e_phnum, HALF', 132 `e_shentsize, HALF', 133 `e_shnum, HALF', 134 `e_shstrndx, HALF', 135 `_,_'') 136 137DEFINE_STRUCT(`Elf32_Move', 138 ``m_value, LWORD', 139 `m_info, WORD', 140 `m_poffset, WORD', 141 `m_repeat, HALF', 142 `m_stride, HALF', 143 `_,_'') 144 145DEFINE_STRUCT(`Elf64_Move', 146 ``m_value, LWORD', 147 `m_info, XWORD', 148 `m_poffset, XWORD', 149 `m_repeat, HALF', 150 `m_stride, HALF', 151 `_,_'') 152 153DEFINE_STRUCT(`Elf32_Phdr', 154 ``p_type, WORD', 155 `p_offset, OFF', 156 `p_vaddr, ADDR', 157 `p_paddr, ADDR', 158 `p_filesz, WORD', 159 `p_memsz, WORD', 160 `p_flags, WORD', 161 `p_align, WORD', 162 `_,_'') 163 164DEFINE_STRUCT(`Elf64_Phdr', 165 ``p_type, WORD', 166 `p_flags, WORD', 167 `p_offset, OFF', 168 `p_vaddr, ADDR', 169 `p_paddr, ADDR', 170 `p_filesz, XWORD', 171 `p_memsz, XWORD', 172 `p_align, XWORD', 173 `_,_'') 174 175DEFINE_STRUCT(`Elf32_Rel', 176 ``r_offset, ADDR', 177 `r_info, WORD', 178 `_,_'') 179 180DEFINE_STRUCT(`Elf64_Rel', 181 ``r_offset, ADDR', 182 `r_info, XWORD', 183 `_,_'') 184 185DEFINE_STRUCT(`Elf32_Rela', 186 ``r_offset, ADDR', 187 `r_info, WORD', 188 `r_addend, SWORD', 189 `_,_'') 190 191DEFINE_STRUCT(`Elf64_Rela', 192 ``r_offset, ADDR', 193 `r_info, XWORD', 194 `r_addend, SXWORD', 195 `_,_'') 196 197DEFINE_STRUCT(`Elf32_Shdr', 198 ``sh_name, WORD', 199 `sh_type, WORD', 200 `sh_flags, WORD', 201 `sh_addr, ADDR', 202 `sh_offset, OFF', 203 `sh_size, WORD', 204 `sh_link, WORD', 205 `sh_info, WORD', 206 `sh_addralign, WORD', 207 `sh_entsize, WORD', 208 `_,_'') 209 210DEFINE_STRUCT(`Elf64_Shdr', 211 ``sh_name, WORD', 212 `sh_type, WORD', 213 `sh_flags, XWORD', 214 `sh_addr, ADDR', 215 `sh_offset, OFF', 216 `sh_size, XWORD', 217 `sh_link, WORD', 218 `sh_info, WORD', 219 `sh_addralign, XWORD', 220 `sh_entsize, XWORD', 221 `_,_'') 222 223DEFINE_STRUCT(`Elf32_Sym', 224 ``st_name, WORD', 225 `st_value, ADDR', 226 `st_size, WORD', 227 `st_info, BYTE', 228 `st_other, BYTE', 229 `st_shndx, HALF', 230 `_,_'') 231 232DEFINE_STRUCT(`Elf64_Sym', 233 ``st_name, WORD', 234 `st_info, BYTE', 235 `st_other, BYTE', 236 `st_shndx, HALF', 237 `st_value, ADDR', 238 `st_size, XWORD', 239 `_,_'') 240 241DEFINE_STRUCT(`Elf32_Syminfo', 242 ``si_boundto, HALF', 243 `si_flags, HALF', 244 `_,_'') 245 246DEFINE_STRUCT(`Elf64_Syminfo', 247 ``si_boundto, HALF', 248 `si_flags, HALF', 249 `_,_'') 250 251DEFINE_STRUCT(`Elf32_Verdaux', 252 ``vda_name, WORD', 253 `vda_next, WORD', 254 `_,_'') 255 256DEFINE_STRUCT(`Elf64_Verdaux', 257 ``vda_name, WORD', 258 `vda_next, WORD', 259 `_,_'') 260 261DEFINE_STRUCT(`Elf32_Verdef', 262 ``vd_version, HALF', 263 `vd_flags, HALF', 264 `vd_ndx, HALF', 265 `vd_cnt, HALF', 266 `vd_hash, WORD', 267 `vd_aux, WORD', 268 `vd_next, WORD', 269 `_,_'') 270 271DEFINE_STRUCT(`Elf64_Verdef', 272 ``vd_version, HALF', 273 `vd_flags, HALF', 274 `vd_ndx, HALF', 275 `vd_cnt, HALF', 276 `vd_hash, WORD', 277 `vd_aux, WORD', 278 `vd_next, WORD', 279 `_,_'') 280 281DEFINE_STRUCT(`Elf32_Verneed', 282 ``vn_version, HALF', 283 `vn_cnt, HALF', 284 `vn_file, WORD', 285 `vn_aux, WORD', 286 `vn_next, WORD', 287 `_,_'') 288 289DEFINE_STRUCT(`Elf64_Verneed', 290 ``vn_version, HALF', 291 `vn_cnt, HALF', 292 `vn_file, WORD', 293 `vn_aux, WORD', 294 `vn_next, WORD', 295 `_,_'') 296 297DEFINE_STRUCT(`Elf32_Vernaux', 298 ``vna_hash, WORD', 299 `vna_flags, HALF', 300 `vna_other, HALF', 301 `vna_name, WORD', 302 `vna_next, WORD', 303 `_,_'') 304 305DEFINE_STRUCT(`Elf64_Vernaux', 306 ``vna_hash, WORD', 307 `vna_flags, HALF', 308 `vna_other, HALF', 309 `vna_name, WORD', 310 `vna_next, WORD', 311 `_,_'') 312