1 1.150 riastrad /* $NetBSD: rtld.h,v 1.150 2025/05/02 23:04:31 riastradh Exp $ */ 2 1.1 cgd 3 1.1 cgd /* 4 1.1 cgd * Copyright 1996 John D. Polstra. 5 1.1 cgd * Copyright 1996 Matt Thomas <matt (at) 3am-software.com> 6 1.1 cgd * All rights reserved. 7 1.1 cgd * 8 1.1 cgd * Redistribution and use in source and binary forms, with or without 9 1.1 cgd * modification, are permitted provided that the following conditions 10 1.1 cgd * are met: 11 1.1 cgd * 1. Redistributions of source code must retain the above copyright 12 1.1 cgd * notice, this list of conditions and the following disclaimer. 13 1.1 cgd * 2. Redistributions in binary form must reproduce the above copyright 14 1.1 cgd * notice, this list of conditions and the following disclaimer in the 15 1.1 cgd * documentation and/or other materials provided with the distribution. 16 1.1 cgd * 3. All advertising materials mentioning features or use of this software 17 1.1 cgd * must display the following acknowledgement: 18 1.1 cgd * This product includes software developed by John Polstra. 19 1.1 cgd * 4. The name of the author may not be used to endorse or promote products 20 1.1 cgd * derived from this software without specific prior written permission. 21 1.1 cgd * 22 1.1 cgd * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 23 1.1 cgd * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 24 1.1 cgd * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 25 1.1 cgd * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 26 1.1 cgd * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 27 1.1 cgd * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 28 1.1 cgd * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 29 1.1 cgd * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 30 1.1 cgd * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 31 1.1 cgd * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 32 1.1 cgd */ 33 1.1 cgd 34 1.8 christos #ifndef RTLD_H 35 1.8 christos #define RTLD_H 36 1.1 cgd 37 1.17 mycroft #include <dlfcn.h> 38 1.105 joerg #include <signal.h> 39 1.75 joerg #include <stdbool.h> 40 1.1 cgd #include <stddef.h> 41 1.1 cgd #include <sys/param.h> 42 1.1 cgd #include <sys/types.h> 43 1.17 mycroft #include <sys/queue.h> 44 1.1 cgd #include <sys/exec_elf.h> 45 1.101 joerg #include <sys/tls.h> 46 1.1 cgd #include "rtldenv.h" 47 1.1 cgd #include "link.h" 48 1.1 cgd 49 1.112 matt #if defined(_RTLD_SOURCE) 50 1.112 matt 51 1.118 matt #if defined(__ARM_EABI__) && !defined(__ARM_DWARF_EH__) 52 1.111 matt #include "unwind.h" 53 1.111 matt #endif 54 1.111 matt 55 1.33 lukem #ifndef RTLD_DEFAULT_LIBRARY_PATH 56 1.9 kleink #define RTLD_DEFAULT_LIBRARY_PATH "/usr/lib" 57 1.33 lukem #endif 58 1.16 christos #define _PATH_LD_HINTS "/etc/ld.so.conf" 59 1.1 cgd 60 1.82 skrll extern size_t _rtld_pagesz; 61 1.8 christos 62 1.55 junyoung #define round_down(x) ((x) & ~(_rtld_pagesz - 1)) 63 1.55 junyoung #define round_up(x) round_down((x) + _rtld_pagesz - 1) 64 1.1 cgd 65 1.1 cgd #define NEW(type) ((type *) xmalloc(sizeof(type))) 66 1.1 cgd #define CNEW(type) ((type *) xcalloc(sizeof(type))) 67 1.1 cgd 68 1.89 roy /* 69 1.89 roy * Fill in a DoneList with an allocation large enough to hold all of 70 1.90 roy * the currently-loaded objects. Keep this in a macro since it calls 71 1.90 roy * alloca and we want that to occur within the scope of the caller. 72 1.150 riastrad * Callers must be built with -Wno-stack-protector. 73 1.89 roy */ 74 1.90 roy #define _rtld_donelist_init(dlp) \ 75 1.90 roy ((dlp)->num_alloc = _rtld_objcount, \ 76 1.90 roy (dlp)->objs = alloca((dlp)->num_alloc * sizeof((dlp)->objs[0])), \ 77 1.90 roy assert((dlp)->objs != NULL), \ 78 1.89 roy (dlp)->num_used = 0) 79 1.89 roy 80 1.137 kamil 81 1.137 kamil typedef struct Struct_Elf_Hash { 82 1.137 kamil unsigned long sysv; 83 1.137 kamil unsigned long gnu; 84 1.137 kamil } Elf_Hash; 85 1.14 thorpej #endif /* _RTLD_SOURCE */ 86 1.14 thorpej 87 1.1 cgd /* 88 1.1 cgd * C++ has mandated the use of the following keywords for its new boolean 89 1.1 cgd * type. We might as well follow their lead. 90 1.1 cgd */ 91 1.1 cgd struct Struct_Obj_Entry; 92 1.1 cgd 93 1.17 mycroft typedef struct Struct_Objlist_Entry { 94 1.17 mycroft SIMPLEQ_ENTRY(Struct_Objlist_Entry) link; 95 1.17 mycroft struct Struct_Obj_Entry *obj; 96 1.17 mycroft } Objlist_Entry; 97 1.17 mycroft 98 1.17 mycroft typedef SIMPLEQ_HEAD(Struct_Objlist, Struct_Objlist_Entry) Objlist; 99 1.17 mycroft 100 1.95 skrll typedef struct Struct_Name_Entry { 101 1.116 christos SIMPLEQ_ENTRY(Struct_Name_Entry) link; 102 1.95 skrll char name[1]; 103 1.95 skrll } Name_Entry; 104 1.95 skrll 105 1.1 cgd typedef struct Struct_Needed_Entry { 106 1.8 christos struct Struct_Needed_Entry *next; 107 1.8 christos struct Struct_Obj_Entry *obj; 108 1.8 christos unsigned long name; /* Offset of name in string table */ 109 1.52 junyoung } Needed_Entry; 110 1.1 cgd 111 1.1 cgd typedef struct _rtld_search_path_t { 112 1.8 christos struct _rtld_search_path_t *sp_next; 113 1.8 christos const char *sp_path; 114 1.8 christos size_t sp_pathlen; 115 1.52 junyoung } Search_Path; 116 1.1 cgd 117 1.106 nonaka typedef struct Struct_Ver_Entry { 118 1.106 nonaka Elf_Word hash; 119 1.106 nonaka u_int flags; 120 1.106 nonaka const char *name; 121 1.106 nonaka const char *file; 122 1.106 nonaka } Ver_Entry; 123 1.106 nonaka 124 1.106 nonaka /* Ver_Entry.flags */ 125 1.106 nonaka #define VER_INFO_HIDDEN 0x01 126 1.106 nonaka 127 1.21 christos #define RTLD_MAX_ENTRY 10 128 1.21 christos #define RTLD_MAX_LIBRARY 4 129 1.22 christos #define RTLD_MAX_CTL 2 130 1.21 christos typedef struct _rtld_library_xform_t { 131 1.21 christos struct _rtld_library_xform_t *next; 132 1.21 christos char *name; 133 1.71 cube const char *ctlname; 134 1.21 christos struct { 135 1.21 christos char *value; 136 1.21 christos char *library[RTLD_MAX_LIBRARY]; 137 1.21 christos } entry[RTLD_MAX_ENTRY]; 138 1.21 christos } Library_Xform; 139 1.21 christos 140 1.1 cgd /* 141 1.1 cgd * Shared object descriptor. 142 1.1 cgd * 143 1.1 cgd * Items marked with "(%)" are dynamically allocated, and must be freed 144 1.1 cgd * when the structure is destroyed. 145 1.1 cgd */ 146 1.1 cgd 147 1.110 matt typedef void (*fptr_t)(void); 148 1.110 matt 149 1.1 cgd typedef struct Struct_Obj_Entry { 150 1.8 christos struct Struct_Obj_Entry *next; 151 1.8 christos char *path; /* Pathname of underlying file (%) */ 152 1.8 christos int refcount; 153 1.8 christos int dl_refcount; /* Number of times loaded by dlopen */ 154 1.8 christos 155 1.8 christos /* These items are computed by map_object() or by digest_phdr(). */ 156 1.8 christos caddr_t mapbase; /* Base address of mapped region */ 157 1.8 christos size_t mapsize; /* Size of mapped region in bytes */ 158 1.8 christos size_t textsize; /* Size of text segment in bytes */ 159 1.8 christos Elf_Addr vaddrbase; /* Base address in shared object file */ 160 1.8 christos caddr_t relocbase; /* Reloc const = mapbase - *vaddrbase */ 161 1.8 christos Elf_Dyn *dynamic; /* Dynamic section */ 162 1.8 christos caddr_t entry; /* Entry point */ 163 1.95 skrll const Elf_Phdr *phdr; /* Program header (may be xmalloc'ed) */ 164 1.95 skrll size_t phsize; /* Size of program header in bytes */ 165 1.8 christos 166 1.8 christos /* Items from the dynamic section. */ 167 1.8 christos Elf_Addr *pltgot; /* PLTGOT table */ 168 1.8 christos const Elf_Rel *rel; /* Relocation entries */ 169 1.8 christos const Elf_Rel *rellim; /* Limit of Relocation entries */ 170 1.30 kleink const Elf_Rela *rela; /* Relocation entries */ 171 1.30 kleink const Elf_Rela *relalim; /* Limit of Relocation entries */ 172 1.149 riastrad const Elf_Relr *relr; /* Relative relocations */ 173 1.149 riastrad const Elf_Relr *relrlim; /* Limit of relative relocations */ 174 1.8 christos const Elf_Rel *pltrel; /* PLT relocation entries */ 175 1.8 christos const Elf_Rel *pltrellim; /* Limit of PLT relocation entries */ 176 1.30 kleink const Elf_Rela *pltrela; /* PLT relocation entries */ 177 1.30 kleink const Elf_Rela *pltrelalim; /* Limit of PLT relocation entries */ 178 1.8 christos const Elf_Sym *symtab; /* Symbol table */ 179 1.8 christos const char *strtab; /* String table */ 180 1.8 christos unsigned long strsize; /* Size in bytes of string table */ 181 1.124 matt #if defined(__mips__) || defined(__riscv__) 182 1.8 christos Elf_Word local_gotno; /* Number of local GOT entries */ 183 1.8 christos Elf_Word symtabno; /* Number of dynamic symbols */ 184 1.8 christos Elf_Word gotsym; /* First dynamic symbol in GOT */ 185 1.8 christos #endif 186 1.8 christos 187 1.138 kamil /* SysV Hash fields */ 188 1.93 skrll const Elf_Symindx *buckets; /* Hash table buckets array */ 189 1.94 christos unsigned long unused1; /* Used to be nbuckets */ 190 1.93 skrll const Elf_Symindx *chains; /* Hash table chain array */ 191 1.8 christos unsigned long nchains; /* Number of chains */ 192 1.8 christos 193 1.8 christos Search_Path *rpaths; /* Search path specified in object */ 194 1.8 christos Needed_Entry *needed; /* Shared objects needed by this (%) */ 195 1.8 christos 196 1.142 skrll fptr_t init; /* Initialization function to call */ 197 1.142 skrll fptr_t fini; /* Termination function to call */ 198 1.8 christos 199 1.67 mycroft u_int32_t mainprog:1, /* True if this is the main program */ 200 1.67 mycroft rtld:1, /* True if this is the dynamic linker */ 201 1.26 christos textrel:1, /* True if there are relocations to 202 1.8 christos * text seg */ 203 1.26 christos symbolic:1, /* True if generated with 204 1.8 christos * "-Bsymbolic" */ 205 1.44 mycroft printed:1, /* True if ldd has printed it */ 206 1.61 mycroft isdynamic:1, /* True if this is a pure PIC object */ 207 1.62 mycroft mainref:1, /* True if on _rtld_list_main */ 208 1.76 ad globalref:1, /* True if on _rtld_list_global */ 209 1.76 ad init_done:1, /* True if .init has been added */ 210 1.114 skrll init_called:1, /* True if .init function has been 211 1.76 ad * called */ 212 1.114 skrll fini_called:1, /* True if .fini function has been 213 1.76 ad * called */ 214 1.97 skrll z_now:1, /* True if object's symbols should be 215 1.97 skrll bound immediately */ 216 1.97 skrll z_nodelete:1, /* True if object should never be 217 1.97 skrll unloaded */ 218 1.97 skrll z_initfirst:1, /* True if object's .init/.fini take 219 1.95 skrll * priority over others */ 220 1.97 skrll z_noopen:1, /* True if object should never be 221 1.97 skrll dlopen'ed */ 222 1.97 skrll phdr_loaded:1, /* Phdr is loaded and doesn't need to 223 1.95 skrll * be freed. */ 224 1.148 riastrad #ifdef __alpha__ 225 1.148 riastrad secureplt:1, /* True if PLT is read-only format */ 226 1.148 riastrad #endif 227 1.101 joerg #if defined(__HAVE_TLS_VARIANT_I) || defined(__HAVE_TLS_VARIANT_II) 228 1.146 joerg tls_static:1, /* True if static TLS offset 229 1.146 joerg * has been allocated */ 230 1.146 joerg tls_dynamic:1, /* True if any non-static DTV entry 231 1.101 joerg * has been allocated */ 232 1.101 joerg #endif 233 1.138 kamil ref_nodel:1, /* Refcount increased to prevent dlclose */ 234 1.138 kamil sysv_hash:1, /* SysV Hash available */ 235 1.138 kamil gnu_hash:1; /* GNU Hash available */ 236 1.1 cgd 237 1.141 kamil struct link_map linkmap; /* for the debugger */ 238 1.17 mycroft 239 1.17 mycroft /* These items are computed by map_object() or by digest_phdr(). */ 240 1.17 mycroft const char *interp; /* Pathname of the interpreter, if any */ 241 1.17 mycroft Objlist dldags; /* Object belongs to these dlopened DAGs (%) */ 242 1.17 mycroft Objlist dagmembers; /* DAG has these members (%) */ 243 1.17 mycroft dev_t dev; /* Object's filesystem's device */ 244 1.17 mycroft ino_t ino; /* Object's inode number */ 245 1.88 skrll 246 1.88 skrll void *ehdr; 247 1.94 christos 248 1.138 kamil /* SysV Hash fields */ 249 1.94 christos uint32_t nbuckets; /* Number of buckets */ 250 1.94 christos uint32_t nbuckets_m; /* Precomputed for fast remainder */ 251 1.94 christos uint8_t nbuckets_s1; 252 1.94 christos uint8_t nbuckets_s2; 253 1.138 kamil 254 1.138 kamil /* GNU Hash fields */ 255 1.138 kamil const uint32_t *buckets_gnu; /* Hash table buckets array */ 256 1.138 kamil uint32_t nbuckets_gnu; /* Number of GNU hash buckets */ 257 1.138 kamil uint32_t nbuckets_m_gnu; /* Precomputed for fast remainder */ 258 1.138 kamil uint8_t nbuckets_s1_gnu; 259 1.138 kamil uint8_t nbuckets_s2_gnu; 260 1.138 kamil const uint32_t *chains_gnu; /* Hash table chain array */ 261 1.138 kamil #define nchains_gnu nchains /* Number of symbols, shared with SysV Hash */ 262 1.138 kamil const Elf_Addr *bloom_gnu; 263 1.138 kamil uint32_t symndx_gnu; /* First accessible symbol on dynsym table */ 264 1.138 kamil uint32_t mask_bm_gnu; /* Bloom filter words - 1 (bitmask) */ 265 1.138 kamil uint32_t shift2_gnu; /* Bloom filter shift count */ 266 1.138 kamil 267 1.95 skrll size_t pathlen; /* Pathname length */ 268 1.116 christos SIMPLEQ_HEAD(, Struct_Name_Entry) names; /* List of names for this 269 1.116 christos * object we know about. */ 270 1.101 joerg 271 1.99 matt #ifdef __powerpc__ 272 1.117 matt #ifdef _LP64 273 1.117 matt Elf_Addr glink; /* global linkage */ 274 1.117 matt #else 275 1.99 matt Elf_Addr *gotptr; /* GOT table (secure-plt only) */ 276 1.99 matt #endif 277 1.117 matt #endif 278 1.101 joerg 279 1.101 joerg #if defined(__HAVE_TLS_VARIANT_I) || defined(__HAVE_TLS_VARIANT_II) 280 1.101 joerg /* Thread Local Storage support for this module */ 281 1.101 joerg size_t tlsindex; /* Index in DTV */ 282 1.101 joerg void *tlsinit; /* Base address of TLS init block */ 283 1.101 joerg size_t tlsinitsize; /* Size of TLS init block */ 284 1.101 joerg size_t tlssize; /* Size of TLS block */ 285 1.101 joerg size_t tlsoffset; /* Offset in the static TLS block */ 286 1.101 joerg size_t tlsalign; /* Needed alignment for static TLS */ 287 1.101 joerg #endif 288 1.106 nonaka 289 1.125 christos #ifdef GNU_RELRO 290 1.125 christos /* relocation readonly */ 291 1.125 christos void *relro_page; 292 1.125 christos size_t relro_size; 293 1.125 christos #endif 294 1.125 christos 295 1.106 nonaka /* symbol versioning */ 296 1.106 nonaka const Elf_Verneed *verneed; /* Required versions. */ 297 1.106 nonaka Elf_Word verneednum; /* Number of entries in verneed table */ 298 1.106 nonaka const Elf_Verdef *verdef; /* Provided versions. */ 299 1.106 nonaka Elf_Word verdefnum; /* Number of entries in verdef table */ 300 1.106 nonaka const Elf_Versym *versyms; /* Symbol versions table */ 301 1.106 nonaka 302 1.106 nonaka Ver_Entry *vertab; /* Versions required/defined by this 303 1.106 nonaka * object */ 304 1.106 nonaka int vertabnum; /* Number of entries in vertab */ 305 1.110 matt 306 1.110 matt /* init_array/fini_array */ 307 1.142 skrll fptr_t *init_array; /* start of init array */ 308 1.110 matt size_t init_arraysz; /* # of entries in it */ 309 1.142 skrll fptr_t *fini_array; /* start of fini array */ 310 1.110 matt size_t fini_arraysz; /* # of entries in it */ 311 1.130 joerg /* IRELATIVE relocations */ 312 1.130 joerg size_t ifunc_remaining; 313 1.143 skrll #if \ 314 1.144 skrll defined(__aarch64__) || \ 315 1.143 skrll defined(__arm__) || \ 316 1.143 skrll defined(__i386__) || \ 317 1.143 skrll defined(__powerpc__) || \ 318 1.143 skrll defined(__sparc__) || \ 319 1.143 skrll defined(__x86_64__) 320 1.133 joerg #define IFUNC_NONPLT 321 1.131 joerg /* On SPARC, the PLT variant is called JMP_IREL and counted above. */ 322 1.131 joerg size_t ifunc_remaining_nonplt; 323 1.131 joerg #endif 324 1.129 joerg size_t cxa_refcount; /* For TLS destructors. */ 325 1.111 matt #ifdef __ARM_EABI__ 326 1.112 matt void *exidx_start; 327 1.111 matt size_t exidx_sz; 328 1.111 matt #endif 329 1.1 cgd } Obj_Entry; 330 1.1 cgd 331 1.89 roy typedef struct Struct_DoneList { 332 1.89 roy const Obj_Entry **objs; /* Array of object pointers */ 333 1.89 roy unsigned int num_alloc; /* Allocated size of the array */ 334 1.89 roy unsigned int num_used; /* Number of array slots used */ 335 1.89 roy } DoneList; 336 1.89 roy 337 1.89 roy 338 1.14 thorpej #if defined(_RTLD_SOURCE) 339 1.14 thorpej 340 1.1 cgd extern struct r_debug _rtld_debug; 341 1.15 kleink extern Search_Path *_rtld_default_paths; 342 1.1 cgd extern Obj_Entry *_rtld_objlist; 343 1.1 cgd extern Obj_Entry **_rtld_objtail; 344 1.95 skrll extern u_int _rtld_objcount; 345 1.95 skrll extern u_int _rtld_objloads; 346 1.134 joerg extern const uintptr_t _rtld_compat_obj[]; 347 1.17 mycroft extern Obj_Entry *_rtld_objmain; 348 1.1 cgd extern Obj_Entry _rtld_objself; 349 1.1 cgd extern Search_Path *_rtld_paths; 350 1.21 christos extern Library_Xform *_rtld_xforms; 351 1.1 cgd extern bool _rtld_trust; 352 1.17 mycroft extern Objlist _rtld_list_global; 353 1.17 mycroft extern Objlist _rtld_list_main; 354 1.17 mycroft extern Elf_Sym _rtld_sym_zero; 355 1.130 joerg extern u_int _rtld_objgen; 356 1.1 cgd 357 1.97 skrll #define RTLD_MODEMASK 0x3 358 1.97 skrll 359 1.106 nonaka /* Flags to be passed into _rtld_symlook_ family of functions. */ 360 1.106 nonaka #define SYMLOOK_IN_PLT 0x01 /* Lookup for PLT symbol */ 361 1.119 joerg #define SYMLOOK_DLSYM 0x02 /* Return newest versioned symbol. 362 1.106 nonaka Used by dlsym. */ 363 1.106 nonaka 364 1.97 skrll /* Flags for _rtld_load_object() and friends. */ 365 1.97 skrll #define _RTLD_GLOBAL 0x01 /* Add object to global DAG. */ 366 1.97 skrll #define _RTLD_MAIN 0x02 367 1.97 skrll #define _RTLD_NOLOAD 0x04 /* dlopen() specified RTLD_NOLOAD. */ 368 1.97 skrll #define _RTLD_DLOPEN 0x08 /* Load_object() called from dlopen(). */ 369 1.97 skrll 370 1.101 joerg /* Preallocation for static TLS model */ 371 1.101 joerg #define RTLD_STATIC_TLS_RESERVATION 64 372 1.101 joerg 373 1.1 cgd /* rtld.c */ 374 1.96 joerg __dso_public char *dlerror(void); 375 1.96 joerg __dso_public void *dlopen(const char *, int); 376 1.96 joerg __dso_public void *dlsym(void *, const char *); 377 1.96 joerg __dso_public int dlclose(void *); 378 1.96 joerg __dso_public int dladdr(const void *, Dl_info *); 379 1.96 joerg __dso_public int dlinfo(void *, int, void *); 380 1.96 joerg __dso_public int dl_iterate_phdr(int (*)(struct dl_phdr_info *, size_t, void *), 381 1.95 skrll void *); 382 1.70 skrll 383 1.108 joerg __dso_public void *_dlauxinfo(void) __pure; 384 1.129 joerg __dso_public void __dl_cxa_refcount(void *addr, ssize_t delta); 385 1.108 joerg 386 1.140 joerg __dso_public pid_t __locked_fork(int *); 387 1.139 joerg 388 1.118 matt #if defined(__ARM_EABI__) && !defined(__ARM_DWARF_EH__) 389 1.111 matt /* 390 1.111 matt * This is used by libgcc to find the start and length of the exception table 391 1.111 matt * associated with a PC. 392 1.111 matt */ 393 1.111 matt __dso_public _Unwind_Ptr __gnu_Unwind_Find_exidx(_Unwind_Ptr, int *); 394 1.111 matt #endif 395 1.111 matt 396 1.95 skrll /* These aren't exported */ 397 1.113 matt void _rtld_error(const char *, ...) __printflike(1,2); 398 1.113 matt void _rtld_die(void) __dead; 399 1.69 skrll void *_rtld_objmain_sym(const char *); 400 1.109 joerg __dso_public void _rtld_debug_state(void) __noinline; 401 1.69 skrll void _rtld_linkmap_add(Obj_Entry *); 402 1.69 skrll void _rtld_linkmap_delete(Obj_Entry *); 403 1.76 ad void _rtld_objlist_push_head(Objlist *, Obj_Entry *); 404 1.76 ad void _rtld_objlist_push_tail(Objlist *, Obj_Entry *); 405 1.69 skrll Objlist_Entry *_rtld_objlist_find(Objlist *, const Obj_Entry *); 406 1.97 skrll void _rtld_ref_dag(Obj_Entry *); 407 1.1 cgd 408 1.104 joerg void _rtld_shared_enter(void); 409 1.104 joerg void _rtld_shared_exit(void); 410 1.105 joerg void _rtld_exclusive_enter(sigset_t *); 411 1.105 joerg void _rtld_exclusive_exit(sigset_t *); 412 1.104 joerg 413 1.136 christos int _rtld_relro(const Obj_Entry *, bool); 414 1.136 christos 415 1.74 christos /* expand.c */ 416 1.74 christos size_t _rtld_expand_path(char *, size_t, const char *, const char *,\ 417 1.74 christos const char *); 418 1.74 christos 419 1.1 cgd /* headers.c */ 420 1.74 christos void _rtld_digest_dynamic(const char *, Obj_Entry *); 421 1.69 skrll Obj_Entry *_rtld_digest_phdr(const Elf_Phdr *, int, caddr_t); 422 1.1 cgd 423 1.1 cgd /* load.c */ 424 1.72 christos Obj_Entry *_rtld_load_object(const char *, int); 425 1.69 skrll int _rtld_load_needed_objects(Obj_Entry *, int); 426 1.69 skrll int _rtld_preload(const char *); 427 1.1 cgd 428 1.97 skrll #define OBJ_ERR (Obj_Entry *)(-1) 429 1.1 cgd /* path.c */ 430 1.74 christos void _rtld_add_paths(const char *, Search_Path **, const char *); 431 1.74 christos void _rtld_process_hints(const char *, Search_Path **, Library_Xform **, 432 1.74 christos const char *); 433 1.71 cube int _rtld_sysctl(const char *, void *, size_t *); 434 1.1 cgd 435 1.1 cgd /* reloc.c */ 436 1.69 skrll int _rtld_do_copy_relocations(const Obj_Entry *); 437 1.69 skrll int _rtld_relocate_objects(Obj_Entry *, bool); 438 1.92 joerg int _rtld_relocate_nonplt_objects(Obj_Entry *); 439 1.130 joerg int _rtld_relocate_plt_lazy(Obj_Entry *); 440 1.69 skrll int _rtld_relocate_plt_objects(const Obj_Entry *); 441 1.69 skrll void _rtld_setup_pltgot(const Obj_Entry *); 442 1.120 joerg Elf_Addr _rtld_resolve_ifunc(const Obj_Entry *, const Elf_Sym *); 443 1.130 joerg Elf_Addr _rtld_resolve_ifunc2(const Obj_Entry *, Elf_Addr); 444 1.130 joerg 445 1.130 joerg void _rtld_call_ifunc(Obj_Entry *, sigset_t *, u_int); 446 1.1 cgd 447 1.1 cgd /* search.c */ 448 1.69 skrll Obj_Entry *_rtld_load_library(const char *, const Obj_Entry *, int); 449 1.1 cgd 450 1.1 cgd /* symbol.c */ 451 1.137 kamil const Elf_Sym *_rtld_symlook_obj(const char *, Elf_Hash *, 452 1.106 nonaka const Obj_Entry *, u_int, const Ver_Entry *); 453 1.69 skrll const Elf_Sym *_rtld_find_symdef(unsigned long, const Obj_Entry *, 454 1.106 nonaka const Obj_Entry **, u_int); 455 1.114 skrll const Elf_Sym *_rtld_find_plt_symdef(unsigned long, const Obj_Entry *, 456 1.84 christos const Obj_Entry **, bool); 457 1.84 christos 458 1.137 kamil const Elf_Sym *_rtld_symlook_list(const char *, Elf_Hash *, 459 1.106 nonaka const Objlist *, const Obj_Entry **, u_int, const Ver_Entry *, DoneList *); 460 1.137 kamil const Elf_Sym *_rtld_symlook_default(const char *, Elf_Hash *, 461 1.106 nonaka const Obj_Entry *, const Obj_Entry **, u_int, const Ver_Entry *); 462 1.137 kamil const Elf_Sym *_rtld_symlook_needed(const char *, Elf_Hash *, 463 1.106 nonaka const Needed_Entry *, const Obj_Entry **, u_int, const Ver_Entry *, 464 1.89 roy DoneList *, DoneList *); 465 1.1 cgd 466 1.106 nonaka /* symver.c */ 467 1.115 christos void _rtld_object_add_name(Obj_Entry *, const char *); 468 1.106 nonaka int _rtld_object_match_name(const Obj_Entry *, const char *); 469 1.106 nonaka int _rtld_verify_object_versions(Obj_Entry *); 470 1.106 nonaka 471 1.106 nonaka static __inline const Ver_Entry * 472 1.106 nonaka _rtld_fetch_ventry(const Obj_Entry *obj, unsigned long symnum) 473 1.106 nonaka { 474 1.106 nonaka Elf_Half vernum; 475 1.106 nonaka 476 1.106 nonaka if (obj->vertab) { 477 1.106 nonaka vernum = VER_NDX(obj->versyms[symnum].vs_vers); 478 1.106 nonaka if (vernum >= obj->vertabnum) { 479 1.106 nonaka _rtld_error("%s: symbol %s has wrong verneed value %d", 480 1.106 nonaka obj->path, &obj->strtab[symnum], vernum); 481 1.106 nonaka } else if (obj->vertab[vernum].hash) { 482 1.106 nonaka return &obj->vertab[vernum]; 483 1.106 nonaka } 484 1.106 nonaka } 485 1.106 nonaka return NULL; 486 1.106 nonaka } 487 1.106 nonaka 488 1.101 joerg #if defined(__HAVE_TLS_VARIANT_I) || defined(__HAVE_TLS_VARIANT_II) 489 1.101 joerg /* tls.c */ 490 1.101 joerg void *_rtld_tls_get_addr(void *, size_t, size_t); 491 1.101 joerg void _rtld_tls_initial_allocation(void); 492 1.101 joerg int _rtld_tls_offset_allocate(Obj_Entry *); 493 1.101 joerg void _rtld_tls_offset_free(Obj_Entry *); 494 1.101 joerg 495 1.101 joerg extern size_t _rtld_tls_dtv_generation; 496 1.101 joerg extern size_t _rtld_tls_max_index; 497 1.101 joerg 498 1.102 joerg __dso_public extern void *__tls_get_addr(void *); 499 1.103 joerg #ifdef __i386__ 500 1.103 joerg __dso_public extern void *___tls_get_addr(void *) 501 1.103 joerg __attribute__((__regparm__(1))); 502 1.103 joerg #endif 503 1.101 joerg #endif 504 1.101 joerg 505 1.1 cgd /* map_object.c */ 506 1.92 joerg struct stat; 507 1.72 christos Obj_Entry *_rtld_map_object(const char *, int, const struct stat *); 508 1.17 mycroft void _rtld_obj_free(Obj_Entry *); 509 1.17 mycroft Obj_Entry *_rtld_obj_new(void); 510 1.31 thorpej 511 1.122 joerg #ifdef RTLD_LOADER 512 1.34 fredette /* function descriptors */ 513 1.34 fredette #ifdef __HAVE_FUNCTION_DESCRIPTORS 514 1.114 skrll Elf_Addr _rtld_function_descriptor_alloc(const Obj_Entry *, 515 1.69 skrll const Elf_Sym *, Elf_Addr); 516 1.69 skrll const void *_rtld_function_descriptor_function(const void *); 517 1.120 joerg 518 1.120 joerg Elf_Addr _rtld_call_function_addr(const Obj_Entry *, Elf_Addr); 519 1.120 joerg #else 520 1.120 joerg static inline Elf_Addr 521 1.120 joerg _rtld_call_function_addr(const Obj_Entry *obj, Elf_Addr addr) 522 1.120 joerg { 523 1.122 joerg return ((Elf_Addr(*)(void))addr)(); 524 1.120 joerg } 525 1.34 fredette #endif /* __HAVE_FUNCTION_DESCRIPTORS */ 526 1.122 joerg #endif /* RTLD_LOADER */ 527 1.1 cgd 528 1.14 thorpej #endif /* _RTLD_SOURCE */ 529 1.14 thorpej 530 1.14 thorpej #endif /* RTLD_H */ 531