12de3b87aSKai Wang /*- 22de3b87aSKai Wang * Copyright (c) 2006,2008-2010 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 * 2667d97fe7SEd Maste * $Id: libelf.h 3174 2015-03-27 17:13:41Z emaste $ 272de3b87aSKai Wang */ 282de3b87aSKai Wang 292de3b87aSKai Wang #ifndef _LIBELF_H_ 302de3b87aSKai Wang #define _LIBELF_H_ 312de3b87aSKai Wang 322de3b87aSKai Wang #include <sys/types.h> 334e5c6975SKai Wang #include <sys/elf32.h> 344e5c6975SKai Wang #include <sys/elf64.h> 352de3b87aSKai Wang 362de3b87aSKai Wang /* Library private data structures */ 372de3b87aSKai Wang typedef struct _Elf Elf; 382de3b87aSKai Wang typedef struct _Elf_Scn Elf_Scn; 392de3b87aSKai Wang 402de3b87aSKai Wang /* File types */ 412de3b87aSKai Wang typedef enum { 422de3b87aSKai Wang ELF_K_NONE = 0, 432de3b87aSKai Wang ELF_K_AR, /* `ar' archives */ 442de3b87aSKai Wang ELF_K_COFF, /* COFF files (unsupported) */ 452de3b87aSKai Wang ELF_K_ELF, /* ELF files */ 462de3b87aSKai Wang ELF_K_NUM 472de3b87aSKai Wang } Elf_Kind; 482de3b87aSKai Wang 492de3b87aSKai Wang #define ELF_K_FIRST ELF_K_NONE 502de3b87aSKai Wang #define ELF_K_LAST ELF_K_NUM 512de3b87aSKai Wang 522de3b87aSKai Wang /* Data types */ 532de3b87aSKai Wang typedef enum { 542de3b87aSKai Wang ELF_T_ADDR, 552de3b87aSKai Wang ELF_T_BYTE, 562de3b87aSKai Wang ELF_T_CAP, 572de3b87aSKai Wang ELF_T_DYN, 582de3b87aSKai Wang ELF_T_EHDR, 592de3b87aSKai Wang ELF_T_HALF, 602de3b87aSKai Wang ELF_T_LWORD, 612de3b87aSKai Wang ELF_T_MOVE, 622de3b87aSKai Wang ELF_T_MOVEP, 632de3b87aSKai Wang ELF_T_NOTE, 642de3b87aSKai Wang ELF_T_OFF, 652de3b87aSKai Wang ELF_T_PHDR, 662de3b87aSKai Wang ELF_T_REL, 672de3b87aSKai Wang ELF_T_RELA, 682de3b87aSKai Wang ELF_T_SHDR, 692de3b87aSKai Wang ELF_T_SWORD, 702de3b87aSKai Wang ELF_T_SXWORD, 712de3b87aSKai Wang ELF_T_SYMINFO, 722de3b87aSKai Wang ELF_T_SYM, 732de3b87aSKai Wang ELF_T_VDEF, 742de3b87aSKai Wang ELF_T_VNEED, 752de3b87aSKai Wang ELF_T_WORD, 762de3b87aSKai Wang ELF_T_XWORD, 772de3b87aSKai Wang ELF_T_GNUHASH, /* GNU style hash tables. */ 782de3b87aSKai Wang ELF_T_NUM 792de3b87aSKai Wang } Elf_Type; 802de3b87aSKai Wang 812de3b87aSKai Wang #define ELF_T_FIRST ELF_T_ADDR 822de3b87aSKai Wang #define ELF_T_LAST ELF_T_GNUHASH 832de3b87aSKai Wang 842de3b87aSKai Wang /* Commands */ 852de3b87aSKai Wang typedef enum { 862de3b87aSKai Wang ELF_C_NULL = 0, 872de3b87aSKai Wang ELF_C_CLR, 882de3b87aSKai Wang ELF_C_FDDONE, 892de3b87aSKai Wang ELF_C_FDREAD, 902de3b87aSKai Wang ELF_C_RDWR, 912de3b87aSKai Wang ELF_C_READ, 922de3b87aSKai Wang ELF_C_SET, 932de3b87aSKai Wang ELF_C_WRITE, 942de3b87aSKai Wang ELF_C_NUM 952de3b87aSKai Wang } Elf_Cmd; 962de3b87aSKai Wang 972de3b87aSKai Wang #define ELF_C_FIRST ELF_C_NULL 982de3b87aSKai Wang #define ELF_C_LAST ELF_C_NUM 992de3b87aSKai Wang 1002de3b87aSKai Wang /* 1012de3b87aSKai Wang * An `Elf_Data' structure describes data in an 1022de3b87aSKai Wang * ELF section. 1032de3b87aSKai Wang */ 1042de3b87aSKai Wang typedef struct _Elf_Data { 1052de3b87aSKai Wang /* 1062de3b87aSKai Wang * `Public' members that are part of the ELF(3) API. 1072de3b87aSKai Wang */ 1082de3b87aSKai Wang uint64_t d_align; 1092de3b87aSKai Wang void *d_buf; 1102de3b87aSKai Wang uint64_t d_off; 1112de3b87aSKai Wang uint64_t d_size; 1122de3b87aSKai Wang Elf_Type d_type; 1132de3b87aSKai Wang unsigned int d_version; 1142de3b87aSKai Wang } Elf_Data; 1152de3b87aSKai Wang 1162de3b87aSKai Wang /* 1172de3b87aSKai Wang * An `Elf_Arhdr' structure describes an archive 1182de3b87aSKai Wang * header. 1192de3b87aSKai Wang */ 1202de3b87aSKai Wang typedef struct { 1212de3b87aSKai Wang time_t ar_date; 1222de3b87aSKai Wang char *ar_name; /* archive member name */ 1232de3b87aSKai Wang gid_t ar_gid; 1242de3b87aSKai Wang mode_t ar_mode; 1252de3b87aSKai Wang char *ar_rawname; /* 'raw' member name */ 1262de3b87aSKai Wang size_t ar_size; 1272de3b87aSKai Wang uid_t ar_uid; 1282de3b87aSKai Wang 1292de3b87aSKai Wang /* 1302de3b87aSKai Wang * Members that are not part of the public API. 1312de3b87aSKai Wang */ 132cf781b2eSEd Maste unsigned int ar_flags; 1332de3b87aSKai Wang } Elf_Arhdr; 1342de3b87aSKai Wang 1352de3b87aSKai Wang /* 1362de3b87aSKai Wang * An `Elf_Arsym' describes an entry in the archive 1372de3b87aSKai Wang * symbol table. 1382de3b87aSKai Wang */ 1392de3b87aSKai Wang typedef struct { 1402de3b87aSKai Wang off_t as_off; /* byte offset to member's header */ 1412de3b87aSKai Wang unsigned long as_hash; /* elf_hash() value for name */ 1422de3b87aSKai Wang char *as_name; /* null terminated symbol name */ 1432de3b87aSKai Wang } Elf_Arsym; 1442de3b87aSKai Wang 1452de3b87aSKai Wang /* 1462de3b87aSKai Wang * Error numbers. 1472de3b87aSKai Wang */ 1482de3b87aSKai Wang 1492de3b87aSKai Wang enum Elf_Error { 1502de3b87aSKai Wang ELF_E_NONE, /* No error */ 1512de3b87aSKai Wang ELF_E_ARCHIVE, /* Malformed ar(1) archive */ 1522de3b87aSKai Wang ELF_E_ARGUMENT, /* Invalid argument */ 1532de3b87aSKai Wang ELF_E_CLASS, /* Mismatched ELF class */ 1542de3b87aSKai Wang ELF_E_DATA, /* Invalid data descriptor */ 1552de3b87aSKai Wang ELF_E_HEADER, /* Missing or malformed ELF header */ 1562de3b87aSKai Wang ELF_E_IO, /* I/O error */ 1572de3b87aSKai Wang ELF_E_LAYOUT, /* Layout constraint violation */ 1582de3b87aSKai Wang ELF_E_MODE, /* Wrong mode for ELF descriptor */ 1592de3b87aSKai Wang ELF_E_RANGE, /* Value out of range */ 1602de3b87aSKai Wang ELF_E_RESOURCE, /* Resource exhaustion */ 1612de3b87aSKai Wang ELF_E_SECTION, /* Invalid section descriptor */ 1622de3b87aSKai Wang ELF_E_SEQUENCE, /* API calls out of sequence */ 1632de3b87aSKai Wang ELF_E_UNIMPL, /* Feature is unimplemented */ 1642de3b87aSKai Wang ELF_E_VERSION, /* Unknown API version */ 165*573456a9SEd Maste ELF_E_INVALID_SECTION_FLAGS, /* Invalid ELF section header flags */ 166*573456a9SEd Maste ELF_E_INVALID_SECTION_TYPE, /* Invalid ELF section header type */ 167*573456a9SEd Maste ELF_E_NOT_COMPRESSED, /* Section is not compressed */ 1682de3b87aSKai Wang ELF_E_NUM /* Max error number */ 1692de3b87aSKai Wang }; 1702de3b87aSKai Wang 1712de3b87aSKai Wang /* 1722de3b87aSKai Wang * Flags defined by the API. 1732de3b87aSKai Wang */ 1742de3b87aSKai Wang 1752de3b87aSKai Wang #define ELF_F_LAYOUT 0x001U /* application will layout the file */ 1762de3b87aSKai Wang #define ELF_F_DIRTY 0x002U /* a section or ELF file is dirty */ 1772de3b87aSKai Wang 1782de3b87aSKai Wang /* ELF(3) API extensions. */ 1792de3b87aSKai Wang #define ELF_F_ARCHIVE 0x100U /* archive creation */ 1802de3b87aSKai Wang #define ELF_F_ARCHIVE_SYSV 0x200U /* SYSV style archive */ 1812de3b87aSKai Wang 18267d97fe7SEd Maste #ifdef __cplusplus 18367d97fe7SEd Maste extern "C" { 18467d97fe7SEd Maste #endif 1852de3b87aSKai Wang Elf *elf_begin(int _fd, Elf_Cmd _cmd, Elf *_elf); 1862de3b87aSKai Wang int elf_cntl(Elf *_elf, Elf_Cmd _cmd); 1872de3b87aSKai Wang int elf_end(Elf *_elf); 1882de3b87aSKai Wang const char *elf_errmsg(int _error); 1892de3b87aSKai Wang int elf_errno(void); 1902de3b87aSKai Wang void elf_fill(int _fill); 1912de3b87aSKai Wang unsigned int elf_flagarhdr(Elf_Arhdr *_arh, Elf_Cmd _cmd, 1922de3b87aSKai Wang unsigned int _flags); 1932de3b87aSKai Wang unsigned int elf_flagdata(Elf_Data *_data, Elf_Cmd _cmd, 1942de3b87aSKai Wang unsigned int _flags); 1952de3b87aSKai Wang unsigned int elf_flagehdr(Elf *_elf, Elf_Cmd _cmd, unsigned int _flags); 1962de3b87aSKai Wang unsigned int elf_flagelf(Elf *_elf, Elf_Cmd _cmd, unsigned int _flags); 1972de3b87aSKai Wang unsigned int elf_flagphdr(Elf *_elf, Elf_Cmd _cmd, unsigned int _flags); 1982de3b87aSKai Wang unsigned int elf_flagscn(Elf_Scn *_scn, Elf_Cmd _cmd, unsigned int _flags); 1992de3b87aSKai Wang unsigned int elf_flagshdr(Elf_Scn *_scn, Elf_Cmd _cmd, unsigned int _flags); 2002de3b87aSKai Wang Elf_Arhdr *elf_getarhdr(Elf *_elf); 2012de3b87aSKai Wang Elf_Arsym *elf_getarsym(Elf *_elf, size_t *_ptr); 2022de3b87aSKai Wang off_t elf_getbase(Elf *_elf); 2032de3b87aSKai Wang Elf_Data *elf_getdata(Elf_Scn *, Elf_Data *); 2042de3b87aSKai Wang char *elf_getident(Elf *_elf, size_t *_ptr); 2052de3b87aSKai Wang int elf_getphdrnum(Elf *_elf, size_t *_dst); 2062de3b87aSKai Wang int elf_getphnum(Elf *_elf, size_t *_dst); /* Deprecated */ 2072de3b87aSKai Wang Elf_Scn *elf_getscn(Elf *_elf, size_t _index); 2082de3b87aSKai Wang int elf_getshdrnum(Elf *_elf, size_t *_dst); 2092de3b87aSKai Wang int elf_getshnum(Elf *_elf, size_t *_dst); /* Deprecated */ 2102de3b87aSKai Wang int elf_getshdrstrndx(Elf *_elf, size_t *_dst); 2112de3b87aSKai Wang int elf_getshstrndx(Elf *_elf, size_t *_dst); /* Deprecated */ 2122de3b87aSKai Wang unsigned long elf_hash(const char *_name); 2132de3b87aSKai Wang Elf_Kind elf_kind(Elf *_elf); 2142de3b87aSKai Wang Elf *elf_memory(char *_image, size_t _size); 2152de3b87aSKai Wang size_t elf_ndxscn(Elf_Scn *_scn); 2162de3b87aSKai Wang Elf_Data *elf_newdata(Elf_Scn *_scn); 2172de3b87aSKai Wang Elf_Scn *elf_newscn(Elf *_elf); 2182de3b87aSKai Wang Elf_Scn *elf_nextscn(Elf *_elf, Elf_Scn *_scn); 2192de3b87aSKai Wang Elf_Cmd elf_next(Elf *_elf); 2202de3b87aSKai Wang Elf *elf_open(int _fd); 2212de3b87aSKai Wang Elf *elf_openmemory(char *_image, size_t _size); 2222de3b87aSKai Wang off_t elf_rand(Elf *_elf, off_t _off); 2232de3b87aSKai Wang Elf_Data *elf_rawdata(Elf_Scn *_scn, Elf_Data *_data); 2242de3b87aSKai Wang char *elf_rawfile(Elf *_elf, size_t *_size); 2252de3b87aSKai Wang int elf_setshstrndx(Elf *_elf, size_t _shnum); 2262de3b87aSKai Wang char *elf_strptr(Elf *_elf, size_t _section, size_t _offset); 2272de3b87aSKai Wang off_t elf_update(Elf *_elf, Elf_Cmd _cmd); 2282de3b87aSKai Wang unsigned int elf_version(unsigned int _version); 2292de3b87aSKai Wang 2302de3b87aSKai Wang long elf32_checksum(Elf *_elf); 2312de3b87aSKai Wang size_t elf32_fsize(Elf_Type _type, size_t _count, 2322de3b87aSKai Wang unsigned int _version); 233*573456a9SEd Maste Elf32_Chdr *elf32_getchdr(Elf_Scn *_scn); 2342de3b87aSKai Wang Elf32_Ehdr *elf32_getehdr(Elf *_elf); 2352de3b87aSKai Wang Elf32_Phdr *elf32_getphdr(Elf *_elf); 2362de3b87aSKai Wang Elf32_Shdr *elf32_getshdr(Elf_Scn *_scn); 2372de3b87aSKai Wang Elf32_Ehdr *elf32_newehdr(Elf *_elf); 2382de3b87aSKai Wang Elf32_Phdr *elf32_newphdr(Elf *_elf, size_t _count); 2392de3b87aSKai Wang Elf_Data *elf32_xlatetof(Elf_Data *_dst, const Elf_Data *_src, 2402de3b87aSKai Wang unsigned int _enc); 2412de3b87aSKai Wang Elf_Data *elf32_xlatetom(Elf_Data *_dst, const Elf_Data *_src, 2422de3b87aSKai Wang unsigned int _enc); 2432de3b87aSKai Wang 2442de3b87aSKai Wang long elf64_checksum(Elf *_elf); 2452de3b87aSKai Wang size_t elf64_fsize(Elf_Type _type, size_t _count, 2462de3b87aSKai Wang unsigned int _version); 247*573456a9SEd Maste Elf64_Chdr *elf64_getchdr(Elf_Scn *_scn); 2482de3b87aSKai Wang Elf64_Ehdr *elf64_getehdr(Elf *_elf); 2492de3b87aSKai Wang Elf64_Phdr *elf64_getphdr(Elf *_elf); 2502de3b87aSKai Wang Elf64_Shdr *elf64_getshdr(Elf_Scn *_scn); 2512de3b87aSKai Wang Elf64_Ehdr *elf64_newehdr(Elf *_elf); 2522de3b87aSKai Wang Elf64_Phdr *elf64_newphdr(Elf *_elf, size_t _count); 2532de3b87aSKai Wang Elf_Data *elf64_xlatetof(Elf_Data *_dst, const Elf_Data *_src, 2542de3b87aSKai Wang unsigned int _enc); 2552de3b87aSKai Wang Elf_Data *elf64_xlatetom(Elf_Data *_dst, const Elf_Data *_src, 2562de3b87aSKai Wang unsigned int _enc); 25767d97fe7SEd Maste #ifdef __cplusplus 25867d97fe7SEd Maste } 25967d97fe7SEd Maste #endif 2602de3b87aSKai Wang 2612de3b87aSKai Wang #endif /* _LIBELF_H_ */ 262