1 /* Data structure for communication from the run-time dynamic linker for 2 loaded ELF shared objects. 3 Copyright (C) 1995-2022 Free Software Foundation, Inc. 4 This file is part of the GNU C Library. 5 6 The GNU C Library is free software; you can redistribute it and/or 7 modify it under the terms of the GNU Lesser General Public 8 License as published by the Free Software Foundation; either 9 version 2.1 of the License, or (at your option) any later version. 10 11 The GNU C Library is distributed in the hope that it will be useful, 12 but WITHOUT ANY WARRANTY; without even the implied warranty of 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14 Lesser General Public License for more details. 15 16 You should have received a copy of the GNU Lesser General Public 17 License along with the GNU C Library; if not, see 18 <https://www.gnu.org/licenses/>. */ 19 20 #ifndef _PRIVATE_LINK_H 21 #define _PRIVATE_LINK_H 1 22 23 #ifdef _LINK_H 24 # error this should be impossible 25 #endif 26 27 # ifndef _ISOMAC 28 /* Get most of the contents from the public header, but we define a 29 different `struct link_map' type for private use. The la_objopen 30 prototype uses the type, so we have to declare it separately. */ 31 # define link_map link_map_public 32 # define la_objopen la_objopen_wrongproto 33 # endif 34 35 #include <elf/link.h> 36 37 # ifndef _ISOMAC 38 39 #undef link_map 40 #undef la_objopen 41 42 struct link_map; 43 extern unsigned int la_objopen (struct link_map *__map, Lmid_t __lmid, 44 uintptr_t *__cookie); 45 46 #include <stdint.h> 47 #include <stddef.h> 48 #include <linkmap.h> 49 #include <dl-fileid.h> 50 #include <dl-lookupcfg.h> 51 #include <tls.h> 52 #include <libc-lock.h> 53 54 55 /* Some internal data structures of the dynamic linker used in the 56 linker map. We only provide forward declarations. */ 57 struct libname_list; 58 struct r_found_version; 59 struct r_search_path_elem; 60 61 /* Forward declaration. */ 62 struct link_map; 63 64 /* Structure to describe a single list of scope elements. The lookup 65 functions get passed an array of pointers to such structures. */ 66 struct r_scope_elem 67 { 68 /* Array of maps for the scope. */ 69 struct link_map **r_list; 70 /* Number of entries in the scope. */ 71 unsigned int r_nlist; 72 }; 73 74 75 /* Structure to record search path and allocation mechanism. */ 76 struct r_search_path_struct 77 { 78 struct r_search_path_elem **dirs; 79 int malloced; 80 }; 81 82 /* Search path information computed by _dl_init_paths. */ 83 extern struct r_search_path_struct __rtld_search_dirs attribute_hidden; 84 extern struct r_search_path_struct __rtld_env_path_list attribute_hidden; 85 86 /* Structure describing a loaded shared object. The `l_next' and `l_prev' 87 members form a chain of all the shared objects loaded at startup. 88 89 These data structures exist in space used by the run-time dynamic linker; 90 modifying them may have disastrous results. 91 92 This data structure might change in future, if necessary. User-level 93 programs must avoid defining objects of this type. */ 94 95 struct link_map 96 { 97 /* These first few members are part of the protocol with the debugger. 98 This is the same format used in SVR4. */ 99 100 ElfW(Addr) l_addr; /* Difference between the address in the ELF 101 file and the addresses in memory. */ 102 char *l_name; /* Absolute file name object was found in. */ 103 ElfW(Dyn) *l_ld; /* Dynamic section of the shared object. */ 104 struct link_map *l_next, *l_prev; /* Chain of loaded objects. */ 105 106 /* All following members are internal to the dynamic linker. 107 They may change without notice. */ 108 109 /* This is an element which is only ever different from a pointer to 110 the very same copy of this type for ld.so when it is used in more 111 than one namespace. */ 112 struct link_map *l_real; 113 114 /* Number of the namespace this link map belongs to. */ 115 Lmid_t l_ns; 116 117 struct libname_list *l_libname; 118 /* Indexed pointers to dynamic section. 119 [0,DT_NUM) are indexed by the processor-independent tags. 120 [DT_NUM,DT_NUM+DT_THISPROCNUM) are indexed by the tag minus DT_LOPROC. 121 [DT_NUM+DT_THISPROCNUM,DT_NUM+DT_THISPROCNUM+DT_VERSIONTAGNUM) are 122 indexed by DT_VERSIONTAGIDX(tagvalue). 123 [DT_NUM+DT_THISPROCNUM+DT_VERSIONTAGNUM, 124 DT_NUM+DT_THISPROCNUM+DT_VERSIONTAGNUM+DT_EXTRANUM) are indexed by 125 DT_EXTRATAGIDX(tagvalue). 126 [DT_NUM+DT_THISPROCNUM+DT_VERSIONTAGNUM+DT_EXTRANUM, 127 DT_NUM+DT_THISPROCNUM+DT_VERSIONTAGNUM+DT_EXTRANUM+DT_VALNUM) are 128 indexed by DT_VALTAGIDX(tagvalue) and 129 [DT_NUM+DT_THISPROCNUM+DT_VERSIONTAGNUM+DT_EXTRANUM+DT_VALNUM, 130 DT_NUM+DT_THISPROCNUM+DT_VERSIONTAGNUM+DT_EXTRANUM+DT_VALNUM+DT_ADDRNUM) 131 are indexed by DT_ADDRTAGIDX(tagvalue), see <elf.h>. */ 132 133 ElfW(Dyn) *l_info[DT_NUM + DT_THISPROCNUM + DT_VERSIONTAGNUM 134 + DT_EXTRANUM + DT_VALNUM + DT_ADDRNUM]; 135 const ElfW(Phdr) *l_phdr; /* Pointer to program header table in core. */ 136 ElfW(Addr) l_entry; /* Entry point location. */ 137 ElfW(Half) l_phnum; /* Number of program header entries. */ 138 ElfW(Half) l_ldnum; /* Number of dynamic segment entries. */ 139 140 /* Array of DT_NEEDED dependencies and their dependencies, in 141 dependency order for symbol lookup (with and without 142 duplicates). There is no entry before the dependencies have 143 been loaded. */ 144 struct r_scope_elem l_searchlist; 145 146 /* We need a special searchlist to process objects marked with 147 DT_SYMBOLIC. */ 148 struct r_scope_elem l_symbolic_searchlist; 149 150 /* Dependent object that first caused this object to be loaded. */ 151 struct link_map *l_loader; 152 153 /* Array with version names. */ 154 struct r_found_version *l_versions; 155 unsigned int l_nversions; 156 157 /* Symbol hash table. */ 158 Elf_Symndx l_nbuckets; 159 Elf32_Word l_gnu_bitmask_idxbits; 160 Elf32_Word l_gnu_shift; 161 const ElfW(Addr) *l_gnu_bitmask; 162 union 163 { 164 const Elf32_Word *l_gnu_buckets; 165 const Elf_Symndx *l_chain; 166 }; 167 union 168 { 169 const Elf32_Word *l_gnu_chain_zero; 170 const Elf_Symndx *l_buckets; 171 }; 172 173 unsigned int l_direct_opencount; /* Reference count for dlopen/dlclose. */ 174 enum /* Where this object came from. */ 175 { 176 lt_executable, /* The main executable program. */ 177 lt_library, /* Library needed by main executable. */ 178 lt_loaded /* Extra run-time loaded shared object. */ 179 } l_type:2; 180 unsigned int l_dt_relr_ref:1; /* Nonzero if GLIBC_ABI_DT_RELR is 181 referenced. */ 182 unsigned int l_relocated:1; /* Nonzero if object's relocations done. */ 183 unsigned int l_init_called:1; /* Nonzero if DT_INIT function called. */ 184 unsigned int l_global:1; /* Nonzero if object in _dl_global_scope. */ 185 unsigned int l_reserved:2; /* Reserved for internal use. */ 186 unsigned int l_main_map:1; /* Nonzero for the map of the main program. */ 187 unsigned int l_visited:1; /* Used internally for map dependency 188 graph traversal. */ 189 unsigned int l_map_used:1; /* These two bits are used during traversal */ 190 unsigned int l_map_done:1; /* of maps in _dl_close_worker. */ 191 unsigned int l_phdr_allocated:1; /* Nonzero if the data structure pointed 192 to by `l_phdr' is allocated. */ 193 unsigned int l_soname_added:1; /* Nonzero if the SONAME is for sure in 194 the l_libname list. */ 195 unsigned int l_faked:1; /* Nonzero if this is a faked descriptor 196 without associated file. */ 197 unsigned int l_need_tls_init:1; /* Nonzero if GL(dl_init_static_tls) 198 should be called on this link map 199 when relocation finishes. */ 200 unsigned int l_auditing:1; /* Nonzero if the DSO is used in auditing. */ 201 unsigned int l_audit_any_plt:1; /* Nonzero if at least one audit module 202 is interested in the PLT interception.*/ 203 unsigned int l_removed:1; /* Nozero if the object cannot be used anymore 204 since it is removed. */ 205 unsigned int l_contiguous:1; /* Nonzero if inter-segment holes are 206 mprotected or if no holes are present at 207 all. */ 208 unsigned int l_free_initfini:1; /* Nonzero if l_initfini can be 209 freed, ie. not allocated with 210 the dummy malloc in ld.so. */ 211 unsigned int l_ld_readonly:1; /* Nonzero if dynamic section is readonly. */ 212 unsigned int l_find_object_processed:1; /* Zero if _dl_find_object_update 213 needs to process this 214 lt_library map. */ 215 216 /* NODELETE status of the map. Only valid for maps of type 217 lt_loaded. Lazy binding sets l_nodelete_active directly, 218 potentially from signal handlers. Initial loading of an 219 DF_1_NODELETE object set l_nodelete_pending. Relocation may 220 set l_nodelete_pending as well. l_nodelete_pending maps are 221 promoted to l_nodelete_active status in the final stages of 222 dlopen, prior to calling ELF constructors. dlclose only 223 refuses to unload l_nodelete_active maps, the pending status is 224 ignored. */ 225 bool l_nodelete_active; 226 bool l_nodelete_pending; 227 228 #include <link_map.h> 229 230 /* Collected information about own RPATH directories. */ 231 struct r_search_path_struct l_rpath_dirs; 232 233 /* Collected results of relocation while profiling. */ 234 struct reloc_result 235 { 236 DL_FIXUP_VALUE_TYPE addr; 237 struct link_map *bound; 238 unsigned int boundndx; 239 uint32_t enterexit; 240 unsigned int flags; 241 /* CONCURRENCY NOTE: This is used to guard the concurrent initialization 242 of the relocation result across multiple threads. See the more 243 detailed notes in elf/dl-runtime.c. */ 244 unsigned int init; 245 } *l_reloc_result; 246 247 /* Pointer to the version information if available. */ 248 ElfW(Versym) *l_versyms; 249 250 /* String specifying the path where this object was found. */ 251 const char *l_origin; 252 253 /* Start and finish of memory map for this object. l_map_start 254 need not be the same as l_addr. */ 255 ElfW(Addr) l_map_start, l_map_end; 256 /* End of the executable part of the mapping. */ 257 ElfW(Addr) l_text_end; 258 259 /* Default array for 'l_scope'. */ 260 struct r_scope_elem *l_scope_mem[4]; 261 /* Size of array allocated for 'l_scope'. */ 262 size_t l_scope_max; 263 /* This is an array defining the lookup scope for this link map. 264 There are initially at most three different scope lists. */ 265 struct r_scope_elem **l_scope; 266 267 /* A similar array, this time only with the local scope. This is 268 used occasionally. */ 269 struct r_scope_elem *l_local_scope[2]; 270 271 /* This information is kept to check for sure whether a shared 272 object is the same as one already loaded. */ 273 struct r_file_id l_file_id; 274 275 /* Collected information about own RUNPATH directories. */ 276 struct r_search_path_struct l_runpath_dirs; 277 278 /* List of object in order of the init and fini calls. */ 279 struct link_map **l_initfini; 280 281 /* List of the dependencies introduced through symbol binding. */ 282 struct link_map_reldeps 283 { 284 unsigned int act; 285 struct link_map *list[]; 286 } *l_reldeps; 287 unsigned int l_reldepsmax; 288 289 /* Nonzero if the DSO is used. */ 290 unsigned int l_used; 291 292 /* Various flag words. */ 293 ElfW(Word) l_feature_1; 294 ElfW(Word) l_flags_1; 295 ElfW(Word) l_flags; 296 297 /* Temporarily used in `dl_close'. */ 298 int l_idx; 299 300 struct link_map_machine l_mach; 301 302 struct 303 { 304 const ElfW(Sym) *sym; 305 int type_class; 306 struct link_map *value; 307 const ElfW(Sym) *ret; 308 } l_lookup_cache; 309 310 /* Thread-local storage related info. */ 311 312 /* Start of the initialization image. */ 313 void *l_tls_initimage; 314 /* Size of the initialization image. */ 315 size_t l_tls_initimage_size; 316 /* Size of the TLS block. */ 317 size_t l_tls_blocksize; 318 /* Alignment requirement of the TLS block. */ 319 size_t l_tls_align; 320 /* Offset of first byte module alignment. */ 321 size_t l_tls_firstbyte_offset; 322 #ifndef NO_TLS_OFFSET 323 # define NO_TLS_OFFSET 0 324 #endif 325 #ifndef FORCED_DYNAMIC_TLS_OFFSET 326 # if NO_TLS_OFFSET == 0 327 # define FORCED_DYNAMIC_TLS_OFFSET -1 328 # elif NO_TLS_OFFSET == -1 329 # define FORCED_DYNAMIC_TLS_OFFSET -2 330 # else 331 # error "FORCED_DYNAMIC_TLS_OFFSET is not defined" 332 # endif 333 #endif 334 /* For objects present at startup time: offset in the static TLS block. */ 335 ptrdiff_t l_tls_offset; 336 /* Index of the module in the dtv array. */ 337 size_t l_tls_modid; 338 339 /* Number of thread_local objects constructed by this DSO. This is 340 atomically accessed and modified and is not always protected by the load 341 lock. See also: CONCURRENCY NOTES in cxa_thread_atexit_impl.c. */ 342 size_t l_tls_dtor_count; 343 344 /* Information used to change permission after the relocations are 345 done. */ 346 ElfW(Addr) l_relro_addr; 347 size_t l_relro_size; 348 349 unsigned long long int l_serial; 350 }; 351 352 #include <dl-relocate-ld.h> 353 354 /* Information used by audit modules. For most link maps, this data 355 immediate follows the link map in memory. For the dynamic linker, 356 it is allocated separately. See link_map_audit_state in 357 <ldsodefs.h>. */ 358 struct auditstate 359 { 360 uintptr_t cookie; 361 unsigned int bindflags; 362 }; 363 364 365 /* This is the hidden instance of struct r_debug_extended used by the 366 dynamic linker. */ 367 extern struct r_debug_extended _r_debug_extended attribute_hidden; 368 369 #if __ELF_NATIVE_CLASS == 32 370 # define symbind symbind32 371 # define LA_SYMBIND "la_symbind32" 372 #elif __ELF_NATIVE_CLASS == 64 373 # define symbind symbind64 374 # define LA_SYMBIND "la_symbind64" 375 #else 376 # error "__ELF_NATIVE_CLASS must be defined" 377 #endif 378 379 extern int __dl_iterate_phdr (int (*callback) (struct dl_phdr_info *info, 380 size_t size, void *data), 381 void *data); 382 hidden_proto (__dl_iterate_phdr) 383 384 /* We use this macro to refer to ELF macros independent of the native 385 wordsize. `ELFW(R_TYPE)' is used in place of `ELF32_R_TYPE' or 386 `ELF64_R_TYPE'. */ 387 #define ELFW(type) _ElfW (ELF, __ELF_NATIVE_CLASS, type) 388 389 # endif /* !_ISOMAC */ 390 #endif /* include/link.h */ 391