12de3b87aSKai Wang/*- 22de3b87aSKai Wang * Copyright (c) 2006,2008-2011 Joseph Koshy 32de3b87aSKai Wang * All rights reserved. 42de3b87aSKai Wang * 52de3b87aSKai Wang * Redistribution and use in source and binary forms, with or without 62de3b87aSKai Wang * modification, are permitted provided that the following conditions 72de3b87aSKai Wang * are met: 82de3b87aSKai Wang * 1. Redistributions of source code must retain the above copyright 92de3b87aSKai Wang * notice, this list of conditions and the following disclaimer. 102de3b87aSKai Wang * 2. Redistributions in binary form must reproduce the above copyright 112de3b87aSKai Wang * notice, this list of conditions and the following disclaimer in the 122de3b87aSKai Wang * documentation and/or other materials provided with the distribution. 132de3b87aSKai Wang * 142de3b87aSKai Wang * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 152de3b87aSKai Wang * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 162de3b87aSKai Wang * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 172de3b87aSKai Wang * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 182de3b87aSKai Wang * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 192de3b87aSKai Wang * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 202de3b87aSKai Wang * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 212de3b87aSKai Wang * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 222de3b87aSKai Wang * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 232de3b87aSKai Wang * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 242de3b87aSKai Wang * SUCH DAMAGE. 252de3b87aSKai Wang */ 262de3b87aSKai Wang 272de3b87aSKai Wang#include <assert.h> 282de3b87aSKai Wang#include <libelf.h> 292de3b87aSKai Wang#include <string.h> 302de3b87aSKai Wang 312de3b87aSKai Wang#include "_libelf.h" 322de3b87aSKai Wang 33*d003e0d7SEd MasteELFTC_VCSID("$Id: libelf_msize.m4 3732 2019-04-22 11:08:38Z jkoshy $"); 342de3b87aSKai Wang 352de3b87aSKai Wang/* WARNING: GENERATED FROM __file__. */ 362de3b87aSKai Wang 372de3b87aSKai Wangstruct msize { 382de3b87aSKai Wang size_t msz32; 392de3b87aSKai Wang size_t msz64; 402de3b87aSKai Wang}; 412de3b87aSKai Wang 422de3b87aSKai Wangdivert(-1) 432de3b87aSKai Wanginclude(SRCDIR`/elf_types.m4') 442de3b87aSKai Wang 452de3b87aSKai Wang/* 462de3b87aSKai Wang * ELF types whose memory representations have a variable size. 472de3b87aSKai Wang */ 482de3b87aSKai Wangdefine(BYTE_SIZE, 1) 492de3b87aSKai Wangdefine(GNUHASH_SIZE, 1) 502de3b87aSKai Wangdefine(NOTE_SIZE, 1) 512de3b87aSKai Wangdefine(VDEF_SIZE, 1) 522de3b87aSKai Wangdefine(VNEED_SIZE, 1) 532de3b87aSKai Wang 542de3b87aSKai Wang/* 552de3b87aSKai Wang * Unimplemented types. 562de3b87aSKai Wang */ 572de3b87aSKai Wangdefine(MOVEP_SIZE, 0) 582de3b87aSKai Wangdefine(SXWORD_SIZE32, 0) 592de3b87aSKai Wangdefine(XWORD_SIZE32, 0) 602de3b87aSKai Wang 612de3b87aSKai Wangdefine(`DEFINE_ELF_MSIZE', 622de3b87aSKai Wang `ifdef($1`_SIZE', 632de3b87aSKai Wang `define($1_SIZE32,$1_SIZE) 642de3b87aSKai Wang define($1_SIZE64,$1_SIZE)', 652de3b87aSKai Wang `ifdef($1`_SIZE32',`', 662de3b87aSKai Wang `define($1_SIZE32,sizeof(Elf32_$2))') 672de3b87aSKai Wang ifdef($1`_SIZE64',`', 682de3b87aSKai Wang `define($1_SIZE64,sizeof(Elf64_$2))')')') 692de3b87aSKai Wangdefine(`DEFINE_ELF_MSIZES', 702de3b87aSKai Wang `ifelse($#,1,`', 712de3b87aSKai Wang `DEFINE_ELF_MSIZE($1) 722de3b87aSKai Wang DEFINE_ELF_MSIZES(shift($@))')') 732de3b87aSKai Wang 742de3b87aSKai WangDEFINE_ELF_MSIZES(ELF_TYPE_LIST) 752de3b87aSKai Wang 762de3b87aSKai Wangdefine(`MSIZE', 772de3b87aSKai Wang `[ELF_T_$1] = { .msz32 = $1_SIZE32, .msz64 = $1_SIZE64 }, 782de3b87aSKai Wang') 792de3b87aSKai Wangdefine(`MSIZES', 802de3b87aSKai Wang `ifelse($#,1,`', 812de3b87aSKai Wang `MSIZE($1) 822de3b87aSKai WangMSIZES(shift($@))')') 832de3b87aSKai Wang 842de3b87aSKai Wangdivert(0) 852de3b87aSKai Wang 862de3b87aSKai Wangstatic struct msize msize[ELF_T_NUM] = { 872de3b87aSKai WangMSIZES(ELF_TYPE_LIST) 882de3b87aSKai Wang}; 892de3b87aSKai Wang 90*d003e0d7SEd Maste/* 91*d003e0d7SEd Maste * Returns the memory size of the specified ELF type 't' of ELF 92*d003e0d7SEd Maste * class 'ec' and ELF version 'version'. 93*d003e0d7SEd Maste * 94*d003e0d7SEd Maste * If the specified combination of ELF type, class, and version is 95*d003e0d7SEd Maste * unsupported then a value of 0 will be returned and the appropriate 96*d003e0d7SEd Maste * library error code set. 97*d003e0d7SEd Maste */ 982de3b87aSKai Wangsize_t 992de3b87aSKai Wang_libelf_msize(Elf_Type t, int elfclass, unsigned int version) 1002de3b87aSKai Wang{ 1012de3b87aSKai Wang size_t sz; 1022de3b87aSKai Wang 1032de3b87aSKai Wang assert(elfclass == ELFCLASS32 || elfclass == ELFCLASS64); 1042de3b87aSKai Wang assert((signed) t >= ELF_T_FIRST && t <= ELF_T_LAST); 1052de3b87aSKai Wang 1062de3b87aSKai Wang if (version != EV_CURRENT) { 1072de3b87aSKai Wang LIBELF_SET_ERROR(VERSION, 0); 1082de3b87aSKai Wang return (0); 1092de3b87aSKai Wang } 1102de3b87aSKai Wang 1112de3b87aSKai Wang sz = (elfclass == ELFCLASS32) ? msize[t].msz32 : msize[t].msz64; 1122de3b87aSKai Wang 113*d003e0d7SEd Maste if (sz == 0) { 114*d003e0d7SEd Maste LIBELF_SET_ERROR(UNIMPL, 0); 115*d003e0d7SEd Maste return (0); 116*d003e0d7SEd Maste } 117*d003e0d7SEd Maste 1182de3b87aSKai Wang return (sz); 1192de3b87aSKai Wang} 120