Phoenix
Object-oriented orthogonally persistent operating system
private.h
00001 /*
00002  * private.h - private definitions for libelf.
00003  * Copyright (C) 1995 - 2007 Michael Riepe
00004  * 
00005  * This library is free software; you can redistribute it and/or
00006  * modify it under the terms of the GNU Library General Public
00007  * License as published by the Free Software Foundation; either
00008  * version 2 of the License, or (at your option) any later version.
00009  * 
00010  * This library is distributed in the hope that it will be useful,
00011  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00012  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00013  * Library General Public License for more details.
00014  * 
00015  * You should have received a copy of the GNU Library General Public
00016  * License along with this library; if not, write to the Free Software
00017  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
00018  */
00019 
00020 /* @(#) $Id: private.h 172 2010-12-13 07:54:26Z vagran $ */
00021 
00022 #ifndef _PRIVATE_H
00023 #define _PRIVATE_H
00024 
00025 #include <defs.h>
00026 #include <types.h>
00027 #include <compat_types.h>
00028 
00029 #ifdef DEBUG
00030 #define ENABLE_DEBUG 1
00031 #define ENABLE_SANITY_CHECKS 1
00032 #else
00033 #define ENABLE_DEBUG 0
00034 #endif
00035 
00036 #define __LIBELF_INTERNAL__ 1
00037 
00038 #if HAVE_CONFIG_H
00039 # include <config.h>
00040 #endif /* HAVE_CONFIG_H */
00041 
00042 #if HAVE_STRUCT_NLIST_DECLARATION
00043 # define nlist __override_nlist_declaration
00044 #endif /* HAVE_STRUCT_NLIST_DECLARATION */
00045 
00046 #if __LIBELF_NEED_LINK_H
00047 # include <link.h>
00048 #elif __LIBELF_NEED_SYS_LINK_H
00049 # include <sys/link.h>
00050 #endif /* __LIBELF_NEED_LINK_H */
00051 
00052 #if HAVE_AR_H
00053 #include <ar.h>
00054 #else /* HAVE_AR_H */
00055 
00056 #define ARMAG   "!<arch>\n"
00057 #define SARMAG  8
00058 
00059 #ifndef NULL
00060 #define NULL    0
00061 #endif
00062 
00063 struct ar_hdr {
00064     char ar_name[16];
00065     char ar_date[12];
00066     char ar_uid[6];
00067     char ar_gid[6];
00068     char ar_mode[8];
00069     char ar_size[10];
00070     char ar_fmag[2];
00071 };
00072 
00073 #define ARFMAG  "`\n"
00074 
00075 #endif /* HAVE_AR_H */
00076 
00077 #include <elf/libelf.h>
00078 
00079 #if HAVE_STRUCT_NLIST_DECLARATION
00080 # undef nlist
00081 #endif /* HAVE_STRUCT_NLIST_DECLARATION */
00082 
00083 #if __LIBELF64
00084 #include "gelf.h"
00085 #endif /* __LIBELF64 */
00086 
00087 typedef struct Scn_Data Scn_Data;
00088 
00089 /*
00090  * ELF descriptor
00091  */
00092 struct Elf_s {
00093     /* common */
00094     size_t e_size; /* file/member size */
00095     size_t e_dsize; /* size of memory image */
00096     Elf_Kind e_kind; /* kind of file */
00097     char* e_data; /* file/member data */
00098     char* e_rawdata; /* file/member raw data */
00099     size_t e_idlen; /* identifier size */
00100     Elf_File *e_fd; /* file descriptor */
00101     unsigned e_count; /* activation count */
00102     /* archive members (still common) */
00103     Elf* e_parent; /* NULL if not an archive member */
00104     size_t e_next; /* 0 if not an archive member */
00105     size_t e_base; /* 0 if not an archive member */
00106     Elf* e_link; /* next archive member or NULL */
00107     Elf_Arhdr* e_arhdr; /* archive member header or NULL */
00108     /* archives */
00109     size_t e_off; /* current member offset (for elf_begin) */
00110     Elf* e_members; /* linked list of active archive members */
00111     char* e_symtab; /* archive symbol table */
00112     size_t e_symlen; /* length of archive symbol table */
00113     char* e_strtab; /* archive string table */
00114     size_t e_strlen; /* length of archive string table */
00115     /* ELF files */
00116     unsigned e_class; /* ELF class */
00117     unsigned e_encoding; /* ELF data encoding */
00118     unsigned e_version; /* ELF version */
00119     char* e_ehdr; /* ELF header */
00120     char* e_phdr; /* ELF program header table */
00121     size_t e_phnum; /* size of program header table */
00122     Elf_Scn* e_scn_1; /* first section */
00123     Elf_Scn* e_scn_n; /* last section */
00124     unsigned e_elf_flags; /* elf flags (ELF_F_*) */
00125     unsigned e_ehdr_flags; /* ehdr flags (ELF_F_*) */
00126     unsigned e_phdr_flags; /* phdr flags (ELF_F_*) */
00127     /* misc flags */
00128     unsigned e_readable :1; /* file is readable */
00129     unsigned e_writable :1; /* file is writable */
00130     unsigned e_disabled :1; /* e_fd has been disabled */
00131     unsigned e_cooked :1; /* e_data was modified */
00132     unsigned e_free_syms :1; /* e_symtab is elf_malloc'ed */
00133     unsigned e_unmap_data :1; /* e_data is mmap'ed */
00134     unsigned e_memory :1; /* created by elf_memory() */
00135     /* magic number for debugging */
00136     long e_magic;
00137 };
00138 
00139 #define ELF_MAGIC   0x012b649e
00140 
00141 #define INIT_ELF    {\
00142     /* e_size */    0,\
00143     /* e_dsize */   0,\
00144     /* e_kind */    ELF_K_NONE,\
00145     /* e_data */    NULL,\
00146     /* e_rawdata */ NULL,\
00147     /* e_idlen */   0,\
00148     /* e_fd */      0,\
00149     /* e_count */   1,\
00150     /* e_parent */  NULL,\
00151     /* e_next */    0,\
00152     /* e_base */    0,\
00153     /* e_link */    NULL,\
00154     /* e_arhdr */   NULL,\
00155     /* e_off */     0,\
00156     /* e_members */ NULL,\
00157     /* e_symtab */  NULL,\
00158     /* e_symlen */  0,\
00159     /* e_strtab */  NULL,\
00160     /* e_strlen */  0,\
00161     /* e_class */   ELFCLASSNONE,\
00162     /* e_encoding */    ELFDATANONE,\
00163     /* e_version */ EV_NONE,\
00164     /* e_ehdr */    NULL,\
00165     /* e_phdr */    NULL,\
00166     /* e_phnum */   0,\
00167     /* e_scn_1 */   NULL,\
00168     /* e_scn_n */   NULL,\
00169     /* e_elf_flags */   0,\
00170     /* e_ehdr_flags */  0,\
00171     /* e_phdr_flags */  0,\
00172     /* e_readable */    0,\
00173     /* e_writable */    0,\
00174     /* e_disabled */    0,\
00175     /* e_cooked */  0,\
00176     /* e_free_syms */   0,\
00177     /* e_unmap_data */  0,\
00178     /* e_memory */  0,\
00179     /* e_magic */   ELF_MAGIC\
00180 }
00181 
00182 /*
00183  * Section descriptor
00184  */
00185 struct Elf_Scn_s {
00186     Elf_Scn* s_link; /* pointer to next Elf_Scn */
00187     Elf* s_elf; /* pointer to elf descriptor */
00188     size_t s_index; /* number of this section */
00189     unsigned s_scn_flags; /* section flags (ELF_F_*) */
00190     unsigned s_shdr_flags; /* shdr flags (ELF_F_*) */
00191     Scn_Data* s_data_1; /* first data buffer */
00192     Scn_Data* s_data_n; /* last data buffer */
00193     Scn_Data* s_rawdata; /* raw data buffer */
00194     /* data copied from shdr */
00195     unsigned s_type; /* section type */
00196     size_t s_offset; /* section offset */
00197     size_t s_size; /* section size */
00198     /* misc flags */
00199     unsigned s_freeme :1; /* this Elf_Scn was elf_malloc'ed */
00200     /* section header */
00201     union {
00202 #if __LIBELF64
00203         Elf64_Shdr u_shdr64;
00204 #endif /* __LIBELF64 */
00205         Elf32_Shdr u_shdr32;
00206     } s_uhdr;
00207     /* magic number for debugging */
00208     long s_magic;
00209 };
00210 #define s_shdr32    s_uhdr.u_shdr32
00211 #define s_shdr64    s_uhdr.u_shdr64
00212 
00213 #define SCN_MAGIC   0x012c747d
00214 
00215 #define INIT_SCN    {\
00216     /* s_link */    NULL,\
00217     /* s_elf */     NULL,\
00218     /* s_index */   0,\
00219     /* s_scn_flags */   0,\
00220     /* s_shdr_flags */  0,\
00221     /* s_data_1 */  NULL,\
00222     /* s_data_n */  NULL,\
00223     /* s_rawdata */ NULL,\
00224     /* s_type */    SHT_NULL,\
00225     /* s_offset */  0,\
00226     /* s_size */    0,\
00227     /* s_freeme */  0,\
00228     /* s_uhdr */    {{0,}},\
00229     /* s_magic */   SCN_MAGIC\
00230 }
00231 
00232 /*
00233  * Data descriptor
00234  */
00235 struct Scn_Data {
00236     Elf_Data sd_data; /* must be first! */
00237     Scn_Data* sd_link; /* pointer to next Scn_Data */
00238     Elf_Scn* sd_scn; /* pointer to section */
00239     char* sd_memdata; /* memory image of section */
00240     unsigned sd_data_flags; /* data flags (ELF_F_*) */
00241     /* misc flags */
00242     unsigned sd_freeme :1; /* this Scn_Data was elf_malloc'ed */
00243     unsigned sd_free_data :1; /* sd_memdata is elf_malloc'ed */
00244     /* magic number for debugging */
00245     long sd_magic;
00246 };
00247 
00248 #define DATA_MAGIC  0x01072639
00249 
00250 #define INIT_DATA   {\
00251     {\
00252     /* d_buf */     NULL,\
00253     /* d_type */    ELF_T_BYTE,\
00254     /* d_size */    0,\
00255     /* d_off */     0,\
00256     /* d_align */   0,\
00257     /* d_version */ EV_NONE\
00258     },\
00259     /* sd_link */   NULL,\
00260     /* sd_scn */    NULL,\
00261     /* sd_memdata */    NULL,\
00262     /* sd_data_flags */ 0,\
00263     /* sd_freeme */ 0,\
00264     /* sd_free_data */  0,\
00265     /* sd_magic */  DATA_MAGIC\
00266 }
00267 
00268 /*
00269  * Private status variables
00270  */
00271 extern unsigned _elf_version;
00272 extern int _elf_errno;
00273 extern int _elf_fill;
00274 extern int _elf_sanity_checks;
00275 #define SANITY_CHECK_STRPTR (1u << 0)
00276 
00277 /*
00278  * Private functions
00279  */
00280 extern void *_elf_read(Elf*, void*, size_t, size_t);
00281 extern void *_elf_mmap(Elf*);
00282 extern int _elf_cook(Elf*);
00283 extern char *_elf_getehdr(Elf*, unsigned);
00284 extern char *_elf_getphdr(Elf*, unsigned);
00285 extern Elf_Data *_elf_xlatetom(const Elf*, Elf_Data*, const Elf_Data*);
00286 extern Elf_Type _elf_scn_type(unsigned);
00287 extern size_t _elf32_xltsize(const Elf_Data *__src, unsigned __dv,
00288     unsigned __encode, int __tof);
00289 extern size_t _elf64_xltsize(const Elf_Data *__src, unsigned __dv,
00290     unsigned __encode, int __tof);
00291 extern int _elf_update_shnum(Elf *__elf, size_t __shnum);
00292 extern Elf_Scn *_elf_first_scn(Elf *__elf);
00293 
00294 /*
00295  * Special translators
00296  */
00297 extern size_t _elf_verdef_32L11_tof(unsigned char *dst,
00298     const unsigned char *src, size_t n);
00299 extern size_t _elf_verdef_32L11_tom(unsigned char *dst,
00300     const unsigned char *src, size_t n);
00301 extern size_t _elf_verdef_32M11_tof(unsigned char *dst,
00302     const unsigned char *src, size_t n);
00303 extern size_t _elf_verdef_32M11_tom(unsigned char *dst,
00304     const unsigned char *src, size_t n);
00305 extern size_t _elf_verdef_64L11_tof(unsigned char *dst,
00306     const unsigned char *src, size_t n);
00307 extern size_t _elf_verdef_64L11_tom(unsigned char *dst,
00308     const unsigned char *src, size_t n);
00309 extern size_t _elf_verdef_64M11_tof(unsigned char *dst,
00310     const unsigned char *src, size_t n);
00311 extern size_t _elf_verdef_64M11_tom(unsigned char *dst,
00312     const unsigned char *src, size_t n);
00313 extern size_t _elf_verneed_32L11_tof(unsigned char *dst,
00314     const unsigned char *src, size_t n);
00315 extern size_t _elf_verneed_32L11_tom(unsigned char *dst,
00316     const unsigned char *src, size_t n);
00317 extern size_t _elf_verneed_32M11_tof(unsigned char *dst,
00318     const unsigned char *src, size_t n);
00319 extern size_t _elf_verneed_32M11_tom(unsigned char *dst,
00320     const unsigned char *src, size_t n);
00321 extern size_t _elf_verneed_64L11_tof(unsigned char *dst,
00322     const unsigned char *src, size_t n);
00323 extern size_t _elf_verneed_64L11_tom(unsigned char *dst,
00324     const unsigned char *src, size_t n);
00325 extern size_t _elf_verneed_64M11_tof(unsigned char *dst,
00326     const unsigned char *src, size_t n);
00327 extern size_t _elf_verneed_64M11_tom(unsigned char *dst,
00328     const unsigned char *src, size_t n);
00329 
00330 /*
00331  * Private data
00332  */
00333 extern const Elf_Scn _elf_scn_init;
00334 extern const Scn_Data _elf_data_init;
00335 extern const size_t _elf_fmsize[2][EV_CURRENT - EV_NONE][ELF_T_NUM][2];
00336 
00337 /*
00338  * Access macros for _elf_fmsize[]
00339  */
00340 #define _fmsize(c,v,t,w)    \
00341     (_elf_fmsize[(c)-ELFCLASS32][(v)-EV_NONE-1][(t)-ELF_T_BYTE][(w)])
00342 #define _fsize(c,v,t)       _fmsize((c),(v),(t),1)
00343 #define _msize(c,v,t)       _fmsize((c),(v),(t),0)
00344 
00345 /*
00346  * Various checks
00347  */
00348 #define valid_class(c)      ((c) >= ELFCLASS32 && (c) <= ELFCLASS64)
00349 #define valid_encoding(e)   ((e) >= ELFDATA2LSB && (e) <= ELFDATA2MSB)
00350 #define valid_version(v)    ((v) > EV_NONE && (v) <= EV_CURRENT)
00351 #define valid_type(t)       ((unsigned)(t) < ELF_T_NUM)
00352 
00353 /*
00354  * Error codes
00355  */
00356 enum {
00357     #define __err__(a, b)   a,
00358     #include "elf_errors.h"     /* include constants from errors.h */
00359     #undef __err__
00360     ERROR_NUM
00361 };
00362 
00363 #define seterr(err) (_elf_errno = (err))
00364 
00365 #define elf_memset          __builtin_memset
00366 #define elf_memcpy          __builtin_memcpy
00367 #define elf_memcmp          __builtin_memcmp
00368 #define elf_memmove         __builtin_memmove
00369 
00370 /*
00371  * Sizes of data types (external representation)
00372  * These definitions should be in <elf.h>, but...
00373  */
00374 #ifndef ELF32_FSZ_ADDR
00375 # define ELF32_FSZ_ADDR     4
00376 # define ELF32_FSZ_HALF     2
00377 # define ELF32_FSZ_OFF      4
00378 # define ELF32_FSZ_SWORD    4
00379 # define ELF32_FSZ_WORD     4
00380 #endif /* ELF32_FSZ_ADDR */
00381 #ifndef ELF64_FSZ_ADDR
00382 # define ELF64_FSZ_ADDR     8
00383 # define ELF64_FSZ_HALF     2
00384 # define ELF64_FSZ_OFF      8
00385 # define ELF64_FSZ_SWORD    4
00386 # define ELF64_FSZ_SXWORD   8
00387 # define ELF64_FSZ_WORD     4
00388 # define ELF64_FSZ_XWORD    8
00389 #endif /* ELF64_FSZ_ADDR */
00390 
00391 /*
00392  * More missing pieces, in no particular order
00393  */
00394 #ifndef SHT_SYMTAB_SHNDX
00395 #define SHT_SYMTAB_SHNDX    18
00396 #endif /* SHT_SYMTAB_SHNDX */
00397 
00398 #ifndef SHN_XINDEX
00399 #define SHN_XINDEX      0xffff
00400 #endif /* SHN_XINDEX */
00401 
00402 #ifndef PN_XNUM
00403 #define PN_XNUM         0xffff
00404 #endif /* PN_XNUM */
00405 
00406 /*
00407  * Debugging
00408  */
00409 #if ENABLE_DEBUG
00410 extern void __elf_assert(const char*, unsigned, const char*);
00411 # if (__STDC__ + 0)
00412 #  define elf_assert(x) do{if(!(x))__elf_assert(__FILE__,__LINE__,#x);}while(0)
00413 # else /* __STDC__ */
00414 #  define elf_assert(x) do{if(!(x))__elf_assert(__FILE__,__LINE__,"x");}while(0)
00415 # endif /* __STDC__ */
00416 #else /* ENABLE_DEBUG */
00417 # define elf_assert(x)  do{}while(0)
00418 #endif /* ENABLE_DEBUG */
00419 
00420 /*
00421  * Return values for certain functions
00422  */
00423 #define LIBELF_SUCCESS  1
00424 #define LIBELF_FAILURE  0
00425 
00426 #endif /* _PRIVATE_H */
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Defines