1/*- 2 * Copyright (c) 2006,2008-2010 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: libelf.h,v 1.1 2019/02/01 05:27:38 jsg Exp $ 27 */ 28 29#ifndef _LIBELF_H_ 30#define _LIBELF_H_ 31 32#include <sys/types.h> 33 34#include <sys/exec_elf.h> 35 36/* Non-standard public data structures */ 37 38/* Capability */ 39typedef struct { 40 Elf32_Word c_tag; 41 union { 42 Elf32_Word c_val; 43 Elf32_Addr c_ptr; 44 } c_un; 45} Elf32_Cap; 46 47typedef struct { 48 Elf64_Xword c_tag; 49 union { 50 Elf64_Xword c_val; 51 Elf64_Addr c_ptr; 52 } c_un; 53} Elf64_Cap; 54 55/* Move */ 56typedef struct { 57 Elf32_Lword m_value; 58 Elf32_Word m_info; 59 Elf32_Word m_poffset; 60 Elf32_Half m_repeat; 61 Elf32_Half m_stride; 62} Elf32_Move; 63 64typedef struct { 65 Elf64_Lword m_value; 66 Elf64_Xword m_info; 67 Elf64_Xword m_poffset; 68 Elf64_Half m_repeat; 69 Elf64_Half m_stride; 70} Elf64_Move; 71 72/* Syminfo Table */ 73typedef struct { 74 Elf32_Half si_boundto; 75 Elf32_Half si_flags; 76} Elf32_Syminfo; 77 78typedef struct { 79 Elf64_Half si_boundto; 80 Elf64_Half si_flags; 81} Elf64_Syminfo; 82 83/* Version Definition */ 84typedef struct { 85 Elf32_Half vd_version; 86 Elf32_Half vd_flags; 87 Elf32_Half vd_ndx; 88 Elf32_Half vd_cnt; 89 Elf32_Word vd_hash; 90 Elf32_Word vd_aux; 91 Elf32_Word vd_next; 92} Elf32_Verdef; 93 94typedef struct { 95 Elf32_Word vda_name; 96 Elf32_Word vda_next; 97} Elf32_Verdaux; 98 99typedef struct { 100 Elf64_Half vd_version; 101 Elf64_Half vd_flags; 102 Elf64_Half vd_ndx; 103 Elf64_Half vd_cnt; 104 Elf64_Word vd_hash; 105 Elf64_Word vd_aux; 106 Elf64_Word vd_next; 107} Elf64_Verdef; 108 109typedef struct { 110 Elf64_Word vda_name; 111 Elf64_Word vda_next; 112} Elf64_Verdaux; 113 114/* Version Dependency */ 115 116typedef struct { 117 Elf32_Half vn_version; 118 Elf32_Half vn_cnt; 119 Elf32_Word vn_file; 120 Elf32_Word vn_aux; 121 Elf32_Word vn_next; 122} Elf32_Verneed; 123 124typedef struct { 125 Elf32_Word vna_hash; 126 Elf32_Half vna_flags; 127 Elf32_Half vna_other; 128 Elf32_Word vna_name; 129 Elf32_Word vna_next; 130} Elf32_Vernaux; 131 132typedef struct { 133 Elf64_Half vn_version; 134 Elf64_Half vn_cnt; 135 Elf64_Word vn_file; 136 Elf64_Word vn_aux; 137 Elf64_Word vn_next; 138} Elf64_Verneed; 139 140typedef struct { 141 Elf64_Word vna_hash; 142 Elf64_Half vna_flags; 143 Elf64_Half vna_other; 144 Elf64_Word vna_name; 145 Elf64_Word vna_next; 146} Elf64_Vernaux; 147 148/* GNU-style hash sections */ 149typedef struct { 150 uint32_t gh_nbuckets; /* Number of hash buckets. */ 151 uint32_t gh_symndx; /* First visible symbol in .dynsym. */ 152 uint32_t gh_maskwords; /* #maskwords used in bloom filter. */ 153 uint32_t gh_shift2; /* Bloom filter shift count. */ 154} Elf_GNU_Hash_Header; 155 156/* Library private data structures */ 157typedef struct _Elf Elf; 158typedef struct _Elf_Scn Elf_Scn; 159 160/* File types */ 161typedef enum { 162 ELF_K_NONE = 0, 163 ELF_K_AR, /* `ar' archives */ 164 ELF_K_COFF, /* COFF files (unsupported) */ 165 ELF_K_ELF, /* ELF files */ 166 ELF_K_NUM 167} Elf_Kind; 168 169#define ELF_K_FIRST ELF_K_NONE 170#define ELF_K_LAST ELF_K_NUM 171 172/* Data types */ 173typedef enum { 174 ELF_T_ADDR, 175 ELF_T_BYTE, 176 ELF_T_CAP, 177 ELF_T_DYN, 178 ELF_T_EHDR, 179 ELF_T_HALF, 180 ELF_T_LWORD, 181 ELF_T_MOVE, 182 ELF_T_MOVEP, 183 ELF_T_NOTE, 184 ELF_T_OFF, 185 ELF_T_PHDR, 186 ELF_T_REL, 187 ELF_T_RELA, 188 ELF_T_SHDR, 189 ELF_T_SWORD, 190 ELF_T_SXWORD, 191 ELF_T_SYMINFO, 192 ELF_T_SYM, 193 ELF_T_VDEF, 194 ELF_T_VNEED, 195 ELF_T_WORD, 196 ELF_T_XWORD, 197 ELF_T_GNUHASH, /* GNU style hash tables. */ 198 ELF_T_NUM 199} Elf_Type; 200 201#define ELF_T_FIRST ELF_T_ADDR 202#define ELF_T_LAST ELF_T_GNUHASH 203 204/* Commands */ 205typedef enum { 206 ELF_C_NULL = 0, 207 ELF_C_CLR, 208 ELF_C_FDDONE, 209 ELF_C_FDREAD, 210 ELF_C_RDWR, 211 ELF_C_READ, 212 ELF_C_SET, 213 ELF_C_WRITE, 214 ELF_C_NUM 215} Elf_Cmd; 216 217#define ELF_C_FIRST ELF_C_NULL 218#define ELF_C_LAST ELF_C_NUM 219 220/* 221 * An `Elf_Data' structure describes data in an 222 * ELF section. 223 */ 224typedef struct _Elf_Data { 225 /* 226 * `Public' members that are part of the ELF(3) API. 227 */ 228 uint64_t d_align; 229 void *d_buf; 230 uint64_t d_off; 231 uint64_t d_size; 232 Elf_Type d_type; 233 unsigned int d_version; 234} Elf_Data; 235 236/* 237 * An `Elf_Arhdr' structure describes an archive 238 * header. 239 */ 240typedef struct { 241 time_t ar_date; 242 char *ar_name; /* archive member name */ 243 gid_t ar_gid; 244 mode_t ar_mode; 245 char *ar_rawname; /* 'raw' member name */ 246 size_t ar_size; 247 uid_t ar_uid; 248 249 /* 250 * Members that are not part of the public API. 251 */ 252 unsigned int ar_flags; 253} Elf_Arhdr; 254 255/* 256 * An `Elf_Arsym' describes an entry in the archive 257 * symbol table. 258 */ 259typedef struct { 260 off_t as_off; /* byte offset to member's header */ 261 unsigned long as_hash; /* elf_hash() value for name */ 262 char *as_name; /* null terminated symbol name */ 263} Elf_Arsym; 264 265/* 266 * Error numbers. 267 */ 268 269enum Elf_Error { 270 ELF_E_NONE, /* No error */ 271 ELF_E_ARCHIVE, /* Malformed ar(1) archive */ 272 ELF_E_ARGUMENT, /* Invalid argument */ 273 ELF_E_CLASS, /* Mismatched ELF class */ 274 ELF_E_DATA, /* Invalid data descriptor */ 275 ELF_E_HEADER, /* Missing or malformed ELF header */ 276 ELF_E_IO, /* I/O error */ 277 ELF_E_LAYOUT, /* Layout constraint violation */ 278 ELF_E_MODE, /* Wrong mode for ELF descriptor */ 279 ELF_E_RANGE, /* Value out of range */ 280 ELF_E_RESOURCE, /* Resource exhaustion */ 281 ELF_E_SECTION, /* Invalid section descriptor */ 282 ELF_E_SEQUENCE, /* API calls out of sequence */ 283 ELF_E_UNIMPL, /* Feature is unimplemented */ 284 ELF_E_VERSION, /* Unknown API version */ 285 ELF_E_NUM /* Max error number */ 286}; 287 288/* 289 * Flags defined by the API. 290 */ 291 292#define ELF_F_LAYOUT 0x001U /* application will layout the file */ 293#define ELF_F_DIRTY 0x002U /* a section or ELF file is dirty */ 294 295/* ELF(3) API extensions. */ 296#define ELF_F_ARCHIVE 0x100U /* archive creation */ 297#define ELF_F_ARCHIVE_SYSV 0x200U /* SYSV style archive */ 298 299#ifdef __cplusplus 300extern "C" { 301#endif 302Elf *elf_begin(int _fd, Elf_Cmd _cmd, Elf *_elf); 303int elf_cntl(Elf *_elf, Elf_Cmd _cmd); 304int elf_end(Elf *_elf); 305const char *elf_errmsg(int _error); 306int elf_errno(void); 307void elf_fill(int _fill); 308unsigned int elf_flagarhdr(Elf_Arhdr *_arh, Elf_Cmd _cmd, 309 unsigned int _flags); 310unsigned int elf_flagdata(Elf_Data *_data, Elf_Cmd _cmd, 311 unsigned int _flags); 312unsigned int elf_flagehdr(Elf *_elf, Elf_Cmd _cmd, unsigned int _flags); 313unsigned int elf_flagelf(Elf *_elf, Elf_Cmd _cmd, unsigned int _flags); 314unsigned int elf_flagphdr(Elf *_elf, Elf_Cmd _cmd, unsigned int _flags); 315unsigned int elf_flagscn(Elf_Scn *_scn, Elf_Cmd _cmd, unsigned int _flags); 316unsigned int elf_flagshdr(Elf_Scn *_scn, Elf_Cmd _cmd, unsigned int _flags); 317Elf_Arhdr *elf_getarhdr(Elf *_elf); 318Elf_Arsym *elf_getarsym(Elf *_elf, size_t *_ptr); 319off_t elf_getbase(Elf *_elf); 320Elf_Data *elf_getdata(Elf_Scn *, Elf_Data *); 321char *elf_getident(Elf *_elf, size_t *_ptr); 322int elf_getphdrnum(Elf *_elf, size_t *_dst); 323int elf_getphnum(Elf *_elf, size_t *_dst); /* Deprecated */ 324Elf_Scn *elf_getscn(Elf *_elf, size_t _index); 325int elf_getshdrnum(Elf *_elf, size_t *_dst); 326int elf_getshnum(Elf *_elf, size_t *_dst); /* Deprecated */ 327int elf_getshdrstrndx(Elf *_elf, size_t *_dst); 328int elf_getshstrndx(Elf *_elf, size_t *_dst); /* Deprecated */ 329unsigned long elf_hash(const char *_name); 330Elf_Kind elf_kind(Elf *_elf); 331Elf *elf_memory(char *_image, size_t _size); 332size_t elf_ndxscn(Elf_Scn *_scn); 333Elf_Data *elf_newdata(Elf_Scn *_scn); 334Elf_Scn *elf_newscn(Elf *_elf); 335Elf_Scn *elf_nextscn(Elf *_elf, Elf_Scn *_scn); 336Elf_Cmd elf_next(Elf *_elf); 337Elf *elf_open(int _fd); 338Elf *elf_openmemory(char *_image, size_t _size); 339off_t elf_rand(Elf *_elf, off_t _off); 340Elf_Data *elf_rawdata(Elf_Scn *_scn, Elf_Data *_data); 341char *elf_rawfile(Elf *_elf, size_t *_size); 342int elf_setshstrndx(Elf *_elf, size_t _shnum); 343char *elf_strptr(Elf *_elf, size_t _section, size_t _offset); 344off_t elf_update(Elf *_elf, Elf_Cmd _cmd); 345unsigned int elf_version(unsigned int _version); 346 347long elf32_checksum(Elf *_elf); 348size_t elf32_fsize(Elf_Type _type, size_t _count, 349 unsigned int _version); 350Elf32_Ehdr *elf32_getehdr(Elf *_elf); 351Elf32_Phdr *elf32_getphdr(Elf *_elf); 352Elf32_Shdr *elf32_getshdr(Elf_Scn *_scn); 353Elf32_Ehdr *elf32_newehdr(Elf *_elf); 354Elf32_Phdr *elf32_newphdr(Elf *_elf, size_t _count); 355Elf_Data *elf32_xlatetof(Elf_Data *_dst, const Elf_Data *_src, 356 unsigned int _enc); 357Elf_Data *elf32_xlatetom(Elf_Data *_dst, const Elf_Data *_src, 358 unsigned int _enc); 359 360long elf64_checksum(Elf *_elf); 361size_t elf64_fsize(Elf_Type _type, size_t _count, 362 unsigned int _version); 363Elf64_Ehdr *elf64_getehdr(Elf *_elf); 364Elf64_Phdr *elf64_getphdr(Elf *_elf); 365Elf64_Shdr *elf64_getshdr(Elf_Scn *_scn); 366Elf64_Ehdr *elf64_newehdr(Elf *_elf); 367Elf64_Phdr *elf64_newphdr(Elf *_elf, size_t _count); 368Elf_Data *elf64_xlatetof(Elf_Data *_dst, const Elf_Data *_src, 369 unsigned int _enc); 370Elf_Data *elf64_xlatetom(Elf_Data *_dst, const Elf_Data *_src, 371 unsigned int _enc); 372#ifdef __cplusplus 373} 374#endif 375 376#endif /* _LIBELF_H_ */ 377