resolve.h revision 1.55
1223637Sbz/* $OpenBSD: resolve.h,v 1.55 2007/11/27 16:42:15 miod Exp $ */ 2126353Smlaier 3126353Smlaier/* 4171172Smlaier * Copyright (c) 1998 Per Fogelstrom, Opsycon AB 5126353Smlaier * 6171172Smlaier * Redistribution and use in source and binary forms, with or without 7171172Smlaier * modification, are permitted provided that the following conditions 8171172Smlaier * are met: 9126353Smlaier * 1. Redistributions of source code must retain the above copyright 10171172Smlaier * notice, this list of conditions and the following disclaimer. 11171172Smlaier * 2. Redistributions in binary form must reproduce the above copyright 12171172Smlaier * notice, this list of conditions and the following disclaimer in the 13171172Smlaier * documentation and/or other materials provided with the distribution. 14171172Smlaier * 15171172Smlaier * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS 16171172Smlaier * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 17126353Smlaier * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 18126353Smlaier * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY 19127082Sobrien * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 20127082Sobrien * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 21127082Sobrien * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 22223637Sbz * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 23126353Smlaier * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 24126353Smlaier * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 25126353Smlaier * SUCH DAMAGE. 26145840Smlaier * 27126353Smlaier */ 28145840Smlaier 29126353Smlaier#ifndef _RESOLVE_H_ 30126353Smlaier#define _RESOLVE_H_ 31126353Smlaier 32126353Smlaier#include <sys/queue.h> 33126353Smlaier#include <link.h> 34126353Smlaier#include <dlfcn.h> 35126353Smlaier 36153722Smlaierstruct load_list { 37153722Smlaier struct load_list *next; 38153722Smlaier void *start; 39145840Smlaier size_t size; 40126353Smlaier int prot; 41223637Sbz Elf_Addr moff; 42126353Smlaier long foff; 43126353Smlaier}; 44126353Smlaier 45126353Smlaier/* 46126353Smlaier * Structure describing a loaded object. 47126353Smlaier * The head of this struct must be compatible 48126353Smlaier * with struct link_map in sys/link.h 49126353Smlaier */ 50126353Smlaiertypedef struct elf_object elf_object_t; 51126353Smlaierstruct elf_object { 52223637Sbz Elf_Addr load_addr; /* Real load address */ 53223637Sbz char *load_name; /* Pointer to object name */ 54223637Sbz Elf_Dyn *load_dyn; /* Pointer to object dynamic data */ 55126353Smlaier struct elf_object *next; 56223637Sbz struct elf_object *prev; 57126353Smlaier/* End struct link_map compatible */ 58171172Smlaier Elf_Addr load_offs; /* Load offset from link address */ 59126353Smlaier 60126353Smlaier struct load_list *load_list; 61126353Smlaier 62126353Smlaier u_int32_t load_size; 63145840Smlaier Elf_Addr got_addr; 64145840Smlaier Elf_Addr got_start; 65223637Sbz size_t got_size; 66126353Smlaier Elf_Addr plt_start; 67126353Smlaier size_t plt_size; 68223637Sbz 69126353Smlaier union { 70126353Smlaier u_long info[DT_NUM + DT_PROCNUM]; 71126353Smlaier struct { 72126353Smlaier Elf_Addr null; /* Not used */ 73126353Smlaier Elf_Addr needed; /* Not used */ 74126353Smlaier Elf_Addr pltrelsz; 75126353Smlaier Elf_Addr *pltgot; 76126353Smlaier Elf_Addr *hash; 77127024Smlaier const char *strtab; 78127024Smlaier const Elf_Sym *symtab; 79127024Smlaier Elf_RelA *rela; 80126353Smlaier Elf_Addr relasz; 81127024Smlaier Elf_Addr relaent; 82223637Sbz Elf_Addr strsz; 83126353Smlaier Elf_Addr syment; 84126353Smlaier void (*init)(void); 85126353Smlaier void (*fini)(void); 86126353Smlaier const char *soname; 87126353Smlaier const char *rpath; 88126353Smlaier Elf_Addr symbolic; 89126353Smlaier Elf_Rel *rel; 90126353Smlaier Elf_Addr relsz; 91223637Sbz Elf_Addr relent; 92126353Smlaier Elf_Addr pltrel; 93223637Sbz Elf_Addr debug; 94126353Smlaier Elf_Addr textrel; 95145840Smlaier Elf_Addr jmprel; 96126353Smlaier } u; 97126353Smlaier } Dyn; 98171172Smlaier#define dyn Dyn.u 99126353Smlaier 100223637Sbz int status; 101145840Smlaier#define STAT_RELOC_DONE 0x01 102126353Smlaier#define STAT_GOT_DONE 0x02 103223637Sbz#define STAT_INIT_DONE 0x04 104223637Sbz#define STAT_FINI_DONE 0x08 105223637Sbz#define STAT_FINI_READY 0x10 106126353Smlaier#define STAT_UNLOADED 0x20 107171172Smlaier 108223637Sbz Elf_Phdr *phdrp; 109171172Smlaier int phdrc; 110171172Smlaier 111126353Smlaier int obj_type; 112126353Smlaier#define OBJTYPE_LDR 1 113126353Smlaier#define OBJTYPE_EXE 2 114126353Smlaier#define OBJTYPE_LIB 3 115126353Smlaier#define OBJTYPE_DLO 4 116126353Smlaier int obj_flags; 117126353Smlaier 118126353Smlaier Elf_Word *buckets; 119126353Smlaier u_int32_t nbuckets; 120126353Smlaier Elf_Word *chains; 121126353Smlaier u_int32_t nchains; 122126353Smlaier Elf_Dyn *dynamic; 123126353Smlaier 124126353Smlaier TAILQ_HEAD(,dep_node) child_list; /* direct dep libs of object */ 125126353Smlaier TAILQ_HEAD(,dep_node) grpsym_list; /* ordered complete dep list */ 126126353Smlaier TAILQ_HEAD(,dep_node) grpref_list; /* refs to other load groups */ 127126353Smlaier 128126353Smlaier int refcount; /* dep libs only */ 129126353Smlaier int opencount; /* # dlopen() & exe */ 130126353Smlaier int grprefcount; /* load group refs */ 131126353Smlaier#define OBJECT_REF_CNT(object) \ 132145840Smlaier ((object->refcount + object->opencount + object->grprefcount)) 133145840Smlaier#define OBJECT_DLREF_CNT(object) \ 134126353Smlaier ((object->opencount + object->grprefcount)) 135126353Smlaier 136126353Smlaier /* object that caused this module to be loaded, used in symbol lookup */ 137126353Smlaier elf_object_t *load_object; 138126353Smlaier 139126353Smlaier void *prebind_data; 140126353Smlaier 141126353Smlaier /* for object confirmation */ 142126353Smlaier dev_t dev; 143126353Smlaier ino_t inode; 144126353Smlaier}; 145126353Smlaier 146126353Smlaierstruct dep_node { 147126353Smlaier TAILQ_ENTRY(dep_node) next_sib; 148126353Smlaier elf_object_t *data; 149126353Smlaier}; 150126353Smlaier 151145840Smlaiervoid _dl_rt_resolve(void); 152145840Smlaier 153223637Sbzvoid _dl_add_object(elf_object_t *object); 154145840Smlaierelf_object_t *_dl_finalize_object(const char *objname, Elf_Dyn *dynp, 155145840Smlaier const long *, const int objtype, const long laddr, const long loff); 156145840Smlaiervoid _dl_remove_object(elf_object_t *object); 157145840Smlaiervoid _dl_cleanup_objects(void); 158223637Sbz 159145840Smlaierelf_object_t *_dl_lookup_object(const char *objname); 160223637Sbzelf_object_t *_dl_load_shlib(const char *, elf_object_t *, int, int); 161145840Smlaierelf_object_t *_dl_tryload_shlib(const char *libname, int type, int flags); 162223637Sbz 163223637Sbzint _dl_md_reloc(elf_object_t *object, int rel, int relsz); 164126353Smlaierint _dl_md_reloc_got(elf_object_t *object, int lazy); 165126353Smlaier 166223637SbzElf_Addr _dl_find_symbol(const char *name, const Elf_Sym **this, 167223637Sbz int flags, const Elf_Sym *ref_sym, elf_object_t *object, 168223637Sbz const elf_object_t **pobj); 169145840SmlaierElf_Addr _dl_find_symbol_bysym(elf_object_t *req_obj, unsigned int symidx, 170145840Smlaier const Elf_Sym **ref, int flags, const Elf_Sym *ref_sym, 171223637Sbz const elf_object_t **pobj); 172126353Smlaier/* 173126353Smlaier * defines for _dl_find_symbol() flag field, three bits of meaning 174126353Smlaier * myself - clear: search all objects, set: search only this object 175223637Sbz * warnnotfound - clear: no warning, set: warn if not found 176223637Sbz * inplt - clear: possible plt ref set: real matching function. 177223637Sbz * 178145840Smlaier * inplt - due to how ELF handles function addresses in shared libraries 179145840Smlaier * &func may actually refer to the plt entry in the main program 180223637Sbz * rather than the actual function address in the .so file. 181145840Smlaier * This rather bizarre behavior is documented in the SVR4 ABI. 182126353Smlaier * when getting the function address to relocate a PLT entry 183126353Smlaier * the 'real' function address is necessary, not the possible PLT address. 184126353Smlaier */ 185126353Smlaier/* myself */ 186126353Smlaier#define SYM_SEARCH_ALL 0x00 187126353Smlaier#define SYM_SEARCH_SELF 0x01 188126353Smlaier#define SYM_SEARCH_OTHER 0x02 189126353Smlaier#define SYM_SEARCH_NEXT 0x04 190126353Smlaier#define SYM_SEARCH_OBJ 0x08 191130617Smlaier/* warnnotfound */ 192145840Smlaier#define SYM_NOWARNNOTFOUND 0x00 193130617Smlaier#define SYM_WARNNOTFOUND 0x10 194130617Smlaier/* inplt */ 195130617Smlaier#define SYM_NOTPLT 0x00 196145840Smlaier#define SYM_PLT 0x20 197130617Smlaier 198130617Smlaier#define SYM_DLSYM 0x40 199130617Smlaier 200130617Smlaierint _dl_load_dep_libs(elf_object_t *object, int flags, int booting); 201130617Smlaierint _dl_rtld(elf_object_t *object); 202130617Smlaiervoid _dl_call_init(elf_object_t *object); 203223637Sbzvoid _dl_link_child(elf_object_t *dep, elf_object_t *p); 204223637Sbzvoid _dl_link_grpsym(elf_object_t *object); 205223637Sbzvoid _dl_cache_grpsym_list(elf_object_t *object); 206126353Smlaiervoid _dl_link_grpref(elf_object_t *load_group, elf_object_t *load_object); 207126353Smlaiervoid _dl_link_dlopen(elf_object_t *dep); 208126353Smlaiervoid _dl_unlink_dlopen(elf_object_t *dep); 209126353Smlaiervoid _dl_notify_unload_shlib(elf_object_t *object); 210126353Smlaiervoid _dl_unload_shlib(elf_object_t *object); 211223637Sbzvoid _dl_unload_dlopen(void); 212223637Sbz 213223637Sbzvoid _dl_run_all_dtors(void); 214223637Sbz 215223637Sbz/* Please don't rename; gdb(1) knows about this. */ 216223637SbzElf_Addr _dl_bind(elf_object_t *object, int index); 217223637Sbz 218223637Sbzint _dl_match_file(struct sod *sodp, char *name, int namelen); 219126353Smlaierchar *_dl_find_shlib(struct sod *sodp, const char *searchpath, int nohints); 220126353Smlaiervoid _dl_load_list_free(struct load_list *load_list); 221126353Smlaier 222126353Smlaiervoid _dl_thread_kern_go(void); 223126353Smlaiervoid _dl_thread_kern_stop(void); 224126353Smlaier 225126353Smlaiervoid _dl_thread_bind_lock(int); 226126353Smlaier 227126353Smlaierextern elf_object_t *_dl_objects; 228126353Smlaierextern elf_object_t *_dl_last_object; 229126353Smlaier 230126353Smlaierextern elf_object_t *_dl_loading_object; 231126353Smlaier 232126353Smlaierextern const char *_dl_progname; 233126353Smlaierextern struct r_debug *_dl_debug_map; 234126353Smlaier 235126353Smlaierextern int _dl_pagesz; 236126353Smlaierextern int _dl_errno; 237126353Smlaier 238126353Smlaierextern char *_dl_libpath; 239126353Smlaierextern char *_dl_preload; 240126353Smlaierextern char *_dl_bindnow; 241126353Smlaierextern char *_dl_traceld; 242126353Smlaierextern char *_dl_tracefmt1; 243126353Smlaierextern char *_dl_tracefmt2; 244126353Smlaierextern char *_dl_traceprog; 245126353Smlaierextern char *_dl_debug; 246126353Smlaier 247126353Smlaier#define DL_DEB(P) do { if (_dl_debug) _dl_printf P ; } while (0) 248126353Smlaier 249126353Smlaier#define DL_NOT_FOUND 1 250126353Smlaier#define DL_CANT_OPEN 2 251126353Smlaier#define DL_NOT_ELF 3 252126353Smlaier#define DL_CANT_OPEN_REF 4 253126353Smlaier#define DL_CANT_MMAP 5 254126353Smlaier#define DL_NO_SYMBOL 6 255126353Smlaier#define DL_INVALID_HANDLE 7 256126353Smlaier#define DL_INVALID_CTL 8 257126353Smlaier#define DL_NO_OBJECT 9 258126353Smlaier#define DL_CANT_FIND_OBJ 10 259126353Smlaier#define DL_CANT_LOAD_OBJ 11 260126353Smlaier 261126353Smlaier#define ELF_ROUND(x,malign) (((x) + (malign)-1) & ~((malign)-1)) 262126353Smlaier#define ELF_TRUNC(x,malign) ((x) & ~((malign)-1)) 263126353Smlaier 264126353Smlaier/* symbol lookup cache */ 265126353Smlaiertypedef struct sym_cache { 266126353Smlaier const elf_object_t *obj; 267126353Smlaier const Elf_Sym *sym; 268126353Smlaier int flags; 269126353Smlaier} sym_cache; 270126353Smlaier 271126353Smlaierextern sym_cache *_dl_symcache; 272223637Sbzextern int _dl_symcachestat_hits; 273126353Smlaierextern int _dl_symcachestat_lookups; 274223637SbzTAILQ_HEAD(dlochld, dep_node); 275126353Smlaierextern struct dlochld _dlopened_child_list; 276223637Sbz 277223637Sbz 278223637Sbz#endif /* _RESOLVE_H_ */ 279223637Sbz