00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #ifndef _PRIVATE_H
00027 #define _PRIVATE_H
00028
00029 #define __LIBELF_INTERNAL__ 1
00030
00031 #if HAVE_CONFIG_H
00032 # include <config.h>
00033 #endif
00034
00035 #include <sys/types.h>
00036
00037 #if STDC_HEADERS
00038 # include <stdlib.h>
00039 # include <string.h>
00040 #else
00041 extern void *malloc(), *realloc();
00042 extern void free(), bcopy(), abort();
00043 extern int strcmp(), strncmp(), memcmp();
00044 extern void *memcpy(), *memmove(), *memset();
00045 #endif
00046
00047 #if HAVE_UNISTD_H
00048 # include <unistd.h>
00049 #else
00050 extern int read(), write(), close();
00051 extern off_t lseek();
00052 #if HAVE_FTRUNCATE
00053 extern int ftruncate();
00054 #endif
00055 #endif
00056
00057 #ifndef SEEK_SET
00058 #define SEEK_SET 0
00059 #endif
00060 #ifndef SEEK_CUR
00061 #define SEEK_CUR 1
00062 #endif
00063 #ifndef SEEK_END
00064 #define SEEK_END 2
00065 #endif
00066
00067 #if !HAVE_MEMCMP
00068 # define memcmp strncmp
00069 #endif
00070 #if !HAVE_MEMCPY
00071 # define memcpy(d,s,n) bcopy(s,d,n)
00072 #endif
00073 #if !HAVE_MEMMOVE
00074 # define memmove(d,s,n) bcopy(s,d,n)
00075 #endif
00076
00077 #if !HAVE_MEMSET
00078 # define memset _elf_memset
00079 extern void *_elf_memset();
00080 #endif
00081
00082 #if HAVE_STRUCT_NLIST_DECLARATION
00083 # define nlist __override_nlist_declaration
00084 #endif
00085
00086 #if __LIBELF_NEED_LINK_H
00087 # include <link.h>
00088 #endif
00089
00090 #include <libelf.h>
00091
00092 #if HAVE_STRUCT_NLIST_DECLARATION
00093 # undef nlist
00094 #endif
00095
00096 #if __LIBELF64
00097 #include <gelf.h>
00098 #endif
00099
00100 typedef struct Scn_Data Scn_Data;
00101
00102
00103
00104
00105 struct Elf {
00106
00107 size_t e_size;
00108 size_t e_dsize;
00109 Elf_Kind e_kind;
00110 char* e_data;
00111 char* e_rawdata;
00112 size_t e_idlen;
00113 int e_fd;
00114 unsigned e_count;
00115
00116 Elf* e_parent;
00117 size_t e_next;
00118 size_t e_base;
00119 Elf* e_link;
00120 Elf_Arhdr* e_arhdr;
00121
00122 size_t e_off;
00123 Elf* e_members;
00124 char* e_symtab;
00125 size_t e_symlen;
00126 char* e_strtab;
00127 size_t e_strlen;
00128
00129 unsigned e_class;
00130 unsigned e_encoding;
00131 unsigned e_version;
00132 char* e_ehdr;
00133 char* e_phdr;
00134 size_t e_phnum;
00135 Elf_Scn* e_scn_1;
00136 Elf_Scn* e_scn_n;
00137 unsigned e_elf_flags;
00138 unsigned e_ehdr_flags;
00139 unsigned e_phdr_flags;
00140
00141 unsigned e_readable : 1;
00142 unsigned e_writable : 1;
00143 unsigned e_disabled : 1;
00144 unsigned e_cooked : 1;
00145 unsigned e_free_syms : 1;
00146 unsigned e_free_ehdr : 1;
00147 unsigned e_free_phdr : 1;
00148 unsigned e_unmap_data : 1;
00149 unsigned e_memory : 1;
00150
00151 long e_magic;
00152 };
00153
00154 #define ELF_MAGIC 0x012b649e
00155
00156 #define INIT_ELF {\
00157 0,\
00158 0,\
00159 ELF_K_NONE,\
00160 NULL,\
00161 NULL,\
00162 0,\
00163 -1,\
00164 1,\
00165 NULL,\
00166 0,\
00167 0,\
00168 NULL,\
00169 NULL,\
00170 0,\
00171 NULL,\
00172 NULL,\
00173 0,\
00174 NULL,\
00175 0,\
00176 ELFCLASSNONE,\
00177 ELFDATANONE,\
00178 EV_NONE,\
00179 NULL,\
00180 NULL,\
00181 0,\
00182 NULL,\
00183 NULL,\
00184 0,\
00185 0,\
00186 0,\
00187 0,\
00188 0,\
00189 0,\
00190 0,\
00191 0,\
00192 0,\
00193 0,\
00194 0,\
00195 0,\
00196 ELF_MAGIC\
00197 }
00198
00199
00200
00201
00202 struct Elf_Scn {
00203 Elf_Scn* s_link;
00204 Elf* s_elf;
00205 size_t s_index;
00206 unsigned s_scn_flags;
00207 unsigned s_shdr_flags;
00208 Scn_Data* s_data_1;
00209 Scn_Data* s_data_n;
00210 Scn_Data* s_rawdata;
00211
00212 unsigned s_type;
00213 size_t s_offset;
00214 size_t s_size;
00215
00216 unsigned s_freeme : 1;
00217
00218 union {
00219 #if __LIBELF64
00220 Elf64_Shdr u_shdr64;
00221 #endif
00222 Elf32_Shdr u_shdr32;
00223 } s_uhdr;
00224
00225 long s_magic;
00226 };
00227 #define s_shdr32 s_uhdr.u_shdr32
00228 #define s_shdr64 s_uhdr.u_shdr64
00229
00230 #define SCN_MAGIC 0x012c747d
00231
00232 #define INIT_SCN {\
00233 NULL,\
00234 NULL,\
00235 0,\
00236 0,\
00237 0,\
00238 NULL,\
00239 NULL,\
00240 NULL,\
00241 SHT_NULL,\
00242 0,\
00243 0,\
00244 0,\
00245 {{0,}},\
00246 SCN_MAGIC\
00247 }
00248
00249
00250
00251
00252 struct Scn_Data {
00253 Elf_Data sd_data;
00254 Scn_Data* sd_link;
00255 Elf_Scn* sd_scn;
00256 char* sd_memdata;
00257 unsigned sd_data_flags;
00258
00259 unsigned sd_freeme : 1;
00260 unsigned sd_free_data : 1;
00261
00262 long sd_magic;
00263 };
00264
00265 #define DATA_MAGIC 0x01072639
00266
00267 #define INIT_DATA {\
00268 {\
00269 NULL,\
00270 ELF_T_BYTE,\
00271 0,\
00272 0,\
00273 0,\
00274 EV_NONE\
00275 },\
00276 NULL,\
00277 NULL,\
00278 NULL,\
00279 0,\
00280 0,\
00281 0,\
00282 DATA_MAGIC\
00283 }
00284
00285
00286
00287
00288 extern unsigned _elf_version;
00289 extern int _elf_errno;
00290 extern int _elf_fill;
00291
00292
00293
00294
00295 extern void *_elf_read __P((Elf*, void*, size_t, size_t));
00296 extern void *_elf_mmap __P((Elf*));
00297 extern int _elf_cook __P((Elf*));
00298 extern char *_elf_getehdr __P((Elf*, unsigned));
00299 extern char *_elf_getphdr __P((Elf*, unsigned));
00300 extern Elf_Data *_elf_xlatetom __P((const Elf*, Elf_Data*, const Elf_Data*));
00301 extern Elf_Type _elf_scn_type __P((unsigned));
00302 extern size_t _elf32_xltsize __P((const Elf_Data *__src, unsigned __dv, unsigned __encode, int __tof));
00303 extern size_t _elf64_xltsize __P((const Elf_Data *__src, unsigned __dv, unsigned __encode, int __tof));
00304 extern int _elf_update_shnum(Elf *__elf, size_t __shnum);
00305
00306
00307
00308
00309 extern size_t _elf_verdef_32L11_tof __P((unsigned char *dst, const unsigned char *src, size_t n));
00310 extern size_t _elf_verdef_32L11_tom __P((unsigned char *dst, const unsigned char *src, size_t n));
00311 extern size_t _elf_verdef_32M11_tof __P((unsigned char *dst, const unsigned char *src, size_t n));
00312 extern size_t _elf_verdef_32M11_tom __P((unsigned char *dst, const unsigned char *src, size_t n));
00313 extern size_t _elf_verdef_64L11_tof __P((unsigned char *dst, const unsigned char *src, size_t n));
00314 extern size_t _elf_verdef_64L11_tom __P((unsigned char *dst, const unsigned char *src, size_t n));
00315 extern size_t _elf_verdef_64M11_tof __P((unsigned char *dst, const unsigned char *src, size_t n));
00316 extern size_t _elf_verdef_64M11_tom __P((unsigned char *dst, const unsigned char *src, size_t n));
00317 extern size_t _elf_verneed_32L11_tof __P((unsigned char *dst, const unsigned char *src, size_t n));
00318 extern size_t _elf_verneed_32L11_tom __P((unsigned char *dst, const unsigned char *src, size_t n));
00319 extern size_t _elf_verneed_32M11_tof __P((unsigned char *dst, const unsigned char *src, size_t n));
00320 extern size_t _elf_verneed_32M11_tom __P((unsigned char *dst, const unsigned char *src, size_t n));
00321 extern size_t _elf_verneed_64L11_tof __P((unsigned char *dst, const unsigned char *src, size_t n));
00322 extern size_t _elf_verneed_64L11_tom __P((unsigned char *dst, const unsigned char *src, size_t n));
00323 extern size_t _elf_verneed_64M11_tof __P((unsigned char *dst, const unsigned char *src, size_t n));
00324 extern size_t _elf_verneed_64M11_tom __P((unsigned char *dst, const unsigned char *src, size_t n));
00325
00326
00327
00328
00329 extern const Elf_Scn _elf_scn_init;
00330 extern const Scn_Data _elf_data_init;
00331 extern const size_t _elf_fmsize[2][EV_CURRENT - EV_NONE][ELF_T_NUM][2];
00332
00333
00334
00335
00336 #define _fmsize(c,v,t,w) \
00337 (_elf_fmsize[(c)-ELFCLASS32][(v)-EV_NONE-1][(t)-ELF_T_BYTE][(w)])
00338 #define _fsize(c,v,t) _fmsize((c),(v),(t),1)
00339 #define _msize(c,v,t) _fmsize((c),(v),(t),0)
00340
00341
00342
00343
00344 #define valid_class(c) ((c) >= ELFCLASS32 && (c) <= ELFCLASS64)
00345 #define valid_encoding(e) ((e) >= ELFDATA2LSB && (e) <= ELFDATA2MSB)
00346 #define valid_version(v) ((v) > EV_NONE && (v) <= EV_CURRENT)
00347 #define valid_type(t) ((t) >= ELF_T_BYTE && (t) < ELF_T_NUM)
00348
00349
00350
00351
00352 enum {
00353 #define __err__(a,b) a,
00354 #include <errors.h>
00355 #undef __err__
00356 ERROR_NUM
00357 };
00358
00359 #define seterr(err) (_elf_errno = (err))
00360
00361
00362
00363
00364
00365 #ifndef ELF32_FSZ_ADDR
00366 # define ELF32_FSZ_ADDR 4
00367 # define ELF32_FSZ_HALF 2
00368 # define ELF32_FSZ_OFF 4
00369 # define ELF32_FSZ_SWORD 4
00370 # define ELF32_FSZ_WORD 4
00371 #endif
00372 #ifndef ELF64_FSZ_ADDR
00373 # define ELF64_FSZ_ADDR 8
00374 # define ELF64_FSZ_HALF 2
00375 # define ELF64_FSZ_OFF 8
00376 # define ELF64_FSZ_SWORD 4
00377 # define ELF64_FSZ_SXWORD 8
00378 # define ELF64_FSZ_WORD 4
00379 # define ELF64_FSZ_XWORD 8
00380 #endif
00381
00382
00383
00384
00385 #ifndef SHT_SYMTAB_SHNDX
00386 #define SHT_SYMTAB_SHNDX 18
00387 #endif
00388
00389
00390
00391
00392 #if ENABLE_DEBUG
00393 extern void __elf_assert __P((const char*, unsigned, const char*));
00394 # if __STDC__
00395 # define elf_assert(x) do{if(!(x))__elf_assert(__FILE__,__LINE__,#x);}while(0)
00396 # else
00397 # define elf_assert(x) do{if(!(x))__elf_assert(__FILE__,__LINE__,"x");}while(0)
00398 # endif
00399 #else
00400 # define elf_assert(x) do{}while(0)
00401 #endif
00402
00403 #endif