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