1164190Sjkoshy/*- 2164190Sjkoshy * Copyright (c) 2006 Joseph Koshy 3164190Sjkoshy * All rights reserved. 4164190Sjkoshy * 5164190Sjkoshy * Redistribution and use in source and binary forms, with or without 6164190Sjkoshy * modification, are permitted provided that the following conditions 7164190Sjkoshy * are met: 8164190Sjkoshy * 1. Redistributions of source code must retain the above copyright 9164190Sjkoshy * notice, this list of conditions and the following disclaimer. 10164190Sjkoshy * 2. Redistributions in binary form must reproduce the above copyright 11164190Sjkoshy * notice, this list of conditions and the following disclaimer in the 12164190Sjkoshy * documentation and/or other materials provided with the distribution. 13164190Sjkoshy * 14164190Sjkoshy * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15164190Sjkoshy * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16164190Sjkoshy * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17164190Sjkoshy * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18164190Sjkoshy * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19164190Sjkoshy * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20164190Sjkoshy * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21164190Sjkoshy * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22164190Sjkoshy * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23164190Sjkoshy * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24164190Sjkoshy * SUCH DAMAGE. 25164190Sjkoshy */ 26164190Sjkoshy 27164190Sjkoshy#include <sys/cdefs.h> 28164190Sjkoshy__FBSDID("$FreeBSD$"); 29164190Sjkoshy 30164190Sjkoshy#include <sys/types.h> 31164190Sjkoshy#include <sys/elf32.h> 32164190Sjkoshy#include <sys/elf64.h> 33164190Sjkoshy 34164190Sjkoshy#include <assert.h> 35164190Sjkoshy#include <libelf.h> 36165317Sjkoshy#include <osreldate.h> 37164190Sjkoshy#include <string.h> 38164190Sjkoshy 39164190Sjkoshy#include "_libelf.h" 40164190Sjkoshy 41164190Sjkoshy/* WARNING: GENERATED FROM __file__. */ 42164190Sjkoshy 43164190Sjkoshystruct msize { 44164190Sjkoshy size_t msz32; 45164190Sjkoshy size_t msz64; 46164190Sjkoshy}; 47164190Sjkoshy 48164190Sjkoshydivert(-1) 49164190Sjkoshyinclude(SRCDIR`/elf_types.m4') 50164190Sjkoshy 51164190Sjkoshydefine(BYTE_SIZE, 1) 52210332Skaiwdefine(GNUHASH_SIZE, 1) 53164190Sjkoshydefine(NOTE_SIZE, 1) 54164190Sjkoshy 55164190Sjkoshy/* 56164190Sjkoshy * Unimplemented types. 57164190Sjkoshy */ 58164190Sjkoshydefine(MOVEP_SIZE, 0) 59164190Sjkoshydefine(SXWORD_SIZE32, 0) 60164190Sjkoshydefine(XWORD_SIZE32, 0) 61164190Sjkoshy 62164190Sjkoshydefine(`DEFINE_ELF_MSIZE', 63164190Sjkoshy `ifdef($1`_SIZE', 64164190Sjkoshy `define($1_SIZE32,$1_SIZE) 65164190Sjkoshy define($1_SIZE64,$1_SIZE)', 66164190Sjkoshy `ifdef($1`_SIZE32',`', 67164190Sjkoshy `define($1_SIZE32,sizeof(Elf32_$2))') 68164190Sjkoshy ifdef($1`_SIZE64',`', 69164190Sjkoshy `define($1_SIZE64,sizeof(Elf64_$2))')')') 70164190Sjkoshydefine(`DEFINE_ELF_MSIZES', 71164190Sjkoshy `ifelse($#,1,`', 72164190Sjkoshy `DEFINE_ELF_MSIZE($1) 73164190Sjkoshy DEFINE_ELF_MSIZES(shift($@))')') 74164190Sjkoshy 75164190SjkoshyDEFINE_ELF_MSIZES(ELF_TYPE_LIST) 76164190Sjkoshy 77164190Sjkoshydefine(`MSIZE', 78165317Sjkoshy `#if __FreeBSD_version >= $3 79165317Sjkoshy [ELF_T_$1] = { .msz32 = $1_SIZE32, .msz64 = $1_SIZE64 }, 80165317Sjkoshy#endif') 81164190Sjkoshydefine(`MSIZES', 82164190Sjkoshy `ifelse($#,1,`', 83164190Sjkoshy `MSIZE($1) 84164190SjkoshyMSIZES(shift($@))')') 85164190Sjkoshy 86164190Sjkoshydivert(0) 87164190Sjkoshy 88164190Sjkoshystatic struct msize msize[ELF_T_NUM] = { 89164190SjkoshyMSIZES(ELF_TYPE_LIST) 90164190Sjkoshy}; 91164190Sjkoshy 92164190Sjkoshysize_t 93164190Sjkoshy_libelf_msize(Elf_Type t, int elfclass, unsigned int version) 94164190Sjkoshy{ 95164190Sjkoshy size_t sz; 96164190Sjkoshy 97164190Sjkoshy assert(elfclass == ELFCLASS32 || elfclass == ELFCLASS64); 98164190Sjkoshy assert((signed) t >= ELF_T_FIRST && t <= ELF_T_LAST); 99164190Sjkoshy 100164190Sjkoshy if (version != EV_CURRENT) { 101164190Sjkoshy LIBELF_SET_ERROR(VERSION, 0); 102164190Sjkoshy return (0); 103164190Sjkoshy } 104164190Sjkoshy 105164190Sjkoshy sz = (elfclass == ELFCLASS32) ? msize[t].msz32 : msize[t].msz64; 106164190Sjkoshy 107164190Sjkoshy return (sz); 108164190Sjkoshy} 109