1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or http://www.opensolaris.org/os/licensing. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 */ 21 /* Copyright (c) 1988 AT&T */ 22 /* All Rights Reserved */ 23 24 /* 25 * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 26 * Use is subject to license terms. 27 * Copyright 2014 PALO, Richard. All rights reserved. 28 */ 29 30 #ifndef _LIBELF_H 31 #define _LIBELF_H 32 33 #include <sys/types.h> 34 #include <sys/elf.h> 35 36 37 #ifdef __cplusplus 38 extern "C" { 39 #endif 40 41 42 #if defined(_ILP32) && (_FILE_OFFSET_BITS != 32) 43 #error "large files are not supported by libelf" 44 #endif 45 46 typedef void Elf_Void; 47 48 /* 49 * Commands 50 */ 51 typedef enum { 52 ELF_C_NULL = 0, /* must be first, 0 */ 53 ELF_C_READ, 54 ELF_C_WRITE, 55 ELF_C_CLR, 56 ELF_C_SET, 57 ELF_C_FDDONE, 58 ELF_C_FDREAD, 59 ELF_C_RDWR, 60 ELF_C_WRIMAGE, 61 ELF_C_IMAGE, 62 ELF_C_NUM /* must be last */ 63 } Elf_Cmd; 64 65 66 /* 67 * Flags 68 */ 69 #define ELF_F_DIRTY 0x1 70 #define ELF_F_LAYOUT 0x4 71 72 73 /* 74 * File types 75 */ 76 typedef enum { 77 ELF_K_NONE = 0, /* must be first, 0 */ 78 ELF_K_AR, 79 ELF_K_COFF, 80 ELF_K_ELF, 81 ELF_K_NUM /* must be last */ 82 } Elf_Kind; 83 84 85 /* 86 * Translation types 87 */ 88 typedef enum { 89 ELF_T_BYTE = 0, /* must be first, 0 */ 90 ELF_T_ADDR, 91 ELF_T_DYN, 92 ELF_T_EHDR, 93 ELF_T_HALF, 94 ELF_T_OFF, 95 ELF_T_PHDR, 96 ELF_T_RELA, 97 ELF_T_REL, 98 ELF_T_SHDR, 99 ELF_T_SWORD, 100 ELF_T_SYM, 101 ELF_T_WORD, 102 ELF_T_VDEF, 103 ELF_T_VNEED, 104 ELF_T_SXWORD, 105 ELF_T_XWORD, 106 ELF_T_SYMINFO, 107 ELF_T_NOTE, 108 ELF_T_MOVE, 109 ELF_T_MOVEP, 110 ELF_T_CAP, 111 ELF_T_NUM /* must be last */ 112 } Elf_Type; 113 114 115 typedef struct Elf Elf; 116 typedef struct Elf_Scn Elf_Scn; 117 118 119 /* 120 * Archive member header 121 */ 122 typedef struct { 123 char *ar_name; 124 time_t ar_date; 125 uid_t ar_uid; 126 gid_t ar_gid; 127 mode_t ar_mode; 128 off_t ar_size; 129 char *ar_rawname; 130 } Elf_Arhdr; 131 132 133 /* 134 * Archive symbol table 135 */ 136 typedef struct { 137 char *as_name; 138 size_t as_off; 139 unsigned long as_hash; 140 } Elf_Arsym; 141 142 143 /* 144 * Data descriptor 145 */ 146 typedef struct { 147 Elf_Void *d_buf; 148 Elf_Type d_type; 149 size_t d_size; 150 off_t d_off; /* offset into section */ 151 size_t d_align; /* alignment in section */ 152 unsigned d_version; /* elf version */ 153 } Elf_Data; 154 155 156 /* 157 * Function declarations 158 */ 159 Elf *elf_begin(int, Elf_Cmd, Elf *); 160 int elf_cntl(Elf *, Elf_Cmd); 161 int elf_end(Elf *); 162 const char *elf_errmsg(int); 163 int elf_errno(void); 164 void elf_fill(int); 165 unsigned elf_flagdata(Elf_Data *, Elf_Cmd, unsigned); 166 unsigned elf_flagehdr(Elf *, Elf_Cmd, unsigned); 167 unsigned elf_flagelf(Elf *, Elf_Cmd, unsigned); 168 unsigned elf_flagphdr(Elf *, Elf_Cmd, unsigned); 169 unsigned elf_flagscn(Elf_Scn *, Elf_Cmd, unsigned); 170 unsigned elf_flagshdr(Elf_Scn *, Elf_Cmd, unsigned); 171 size_t elf32_fsize(Elf_Type, size_t, unsigned); 172 Elf_Arhdr *elf_getarhdr(Elf *); 173 Elf_Arsym *elf_getarsym(Elf *, size_t *); 174 off_t elf_getbase(Elf *); 175 Elf_Data *elf_getdata(Elf_Scn *, Elf_Data *); 176 Elf32_Ehdr *elf32_getehdr(Elf *); 177 char *elf_getident(Elf *, size_t *); 178 Elf32_Phdr *elf32_getphdr(Elf *); 179 Elf_Scn *elf_getscn(Elf *elf, size_t); 180 Elf32_Shdr *elf32_getshdr(Elf_Scn *); 181 int elf_getphnum(Elf *, size_t *); 182 int elf_getphdrnum(Elf *, size_t *); 183 int elf_getshnum(Elf *, size_t *); 184 int elf_getshdrnum(Elf *, size_t *); 185 int elf_getshstrndx(Elf *, size_t *); 186 int elf_getshdrstrndx(Elf *, size_t *); 187 unsigned long elf_hash(const char *); 188 uint_t elf_sys_encoding(void); 189 long elf32_checksum(Elf *); 190 Elf_Kind elf_kind(Elf *); 191 Elf *elf_memory(char *, size_t); 192 size_t elf_ndxscn(Elf_Scn *); 193 Elf_Data *elf_newdata(Elf_Scn *); 194 Elf32_Ehdr *elf32_newehdr(Elf *); 195 Elf32_Phdr *elf32_newphdr(Elf *, size_t); 196 Elf_Scn *elf_newscn(Elf *); 197 Elf_Scn *elf_nextscn(Elf *, Elf_Scn *); 198 Elf_Cmd elf_next(Elf *); 199 size_t elf_rand(Elf *, size_t); 200 Elf_Data *elf_rawdata(Elf_Scn *, Elf_Data *); 201 char *elf_rawfile(Elf *, size_t *); 202 char *elf_strptr(Elf *, size_t, size_t); 203 off_t elf_update(Elf *, Elf_Cmd); 204 unsigned elf_version(unsigned); 205 Elf_Data *elf32_xlatetof(Elf_Data *, const Elf_Data *, unsigned); 206 Elf_Data *elf32_xlatetom(Elf_Data *, const Elf_Data *, unsigned); 207 208 #if defined(_LP64) || defined(_LONGLONG_TYPE) 209 size_t elf64_fsize(Elf_Type, size_t, unsigned); 210 Elf64_Ehdr *elf64_getehdr(Elf *); 211 Elf64_Phdr *elf64_getphdr(Elf *); 212 Elf64_Shdr *elf64_getshdr(Elf_Scn *); 213 long elf64_checksum(Elf *); 214 Elf64_Ehdr *elf64_newehdr(Elf *); 215 Elf64_Phdr *elf64_newphdr(Elf *, size_t); 216 Elf_Data *elf64_xlatetof(Elf_Data *, const Elf_Data *, unsigned); 217 Elf_Data *elf64_xlatetom(Elf_Data *, const Elf_Data *, unsigned); 218 #endif /* (defined(_LP64) || defined(_LONGLONG_TYPE) */ 219 220 #ifdef __cplusplus 221 } 222 #endif 223 224 #endif /* _LIBELF_H */ 225