]> git.ipfire.org Git - thirdparty/glibc.git/blame - sysdeps/generic/ldsodefs.h
Update copyright dates with scripts/update-copyrights
[thirdparty/glibc.git] / sysdeps / generic / ldsodefs.h
CommitLineData
a42195db 1/* Run-time dynamic linker data structures for loaded ELF shared objects.
2b778ceb 2 Copyright (C) 1995-2021 Free Software Foundation, Inc.
a42195db
UD
3 This file is part of the GNU C Library.
4
5 The GNU C Library is free software; you can redistribute it and/or
41bdb6e2
AJ
6 modify it under the terms of the GNU Lesser General Public
7 License as published by the Free Software Foundation; either
8 version 2.1 of the License, or (at your option) any later version.
a42195db
UD
9
10 The GNU C Library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
41bdb6e2 13 Lesser General Public License for more details.
a42195db 14
41bdb6e2 15 You should have received a copy of the GNU Lesser General Public
59ba27a6 16 License along with the GNU C Library; if not, see
5a82c748 17 <https://www.gnu.org/licenses/>. */
a42195db
UD
18
19#ifndef _LDSODEFS_H
20#define _LDSODEFS_H 1
21
22#include <features.h>
23
3fb55878 24#include <stdbool.h>
a42195db
UD
25#define __need_size_t
26#define __need_NULL
27#include <stddef.h>
ef52edfc 28#include <string.h>
e054f494 29#include <stdint.h>
a42195db
UD
30
31#include <elf.h>
32#include <dlfcn.h>
5688da55 33#include <fpu_control.h>
d6b5d570 34#include <sys/mman.h>
a42195db 35#include <link.h>
c0282c06 36#include <dl-lookupcfg.h>
ce460d04 37#include <dl-sysdep.h>
ec999b8e 38#include <libc-lock.h>
5688da55 39#include <hp-timing.h>
535b764d 40#include <tls.h>
1daccf40 41#include <list_t.h>
a42195db
UD
42
43__BEGIN_DECLS
44
9bac1d86
L
45#define VERSYMIDX(sym) (DT_NUM + DT_THISPROCNUM + DT_VERSIONTAGIDX (sym))
46#define VALIDX(tag) (DT_NUM + DT_THISPROCNUM + DT_VERSIONTAGNUM \
47 + DT_EXTRANUM + DT_VALTAGIDX (tag))
48#define ADDRIDX(tag) (DT_NUM + DT_THISPROCNUM + DT_VERSIONTAGNUM \
49 + DT_EXTRANUM + DT_VALNUM + DT_ADDRTAGIDX (tag))
50
23c1c256
MS
51/* Type of GNU hash which the machine uses. */
52#ifndef ELF_MACHINE_GNU_HASH_ADDRIDX
53# define ELF_MACHINE_GNU_HASH_ADDRIDX ADDRIDX (DT_GNU_HASH)
54#endif
55
56/* Calculate the index of a symbol in GNU hash. */
57#ifndef ELF_MACHINE_HASH_SYMIDX
58# define ELF_MACHINE_HASH_SYMIDX(map, hasharr) \
59 ((hasharr) - (map)->l_gnu_chain_zero)
60#endif
61
62/* Setup MIPS xhash. Defined only for MIPS. */
63#ifndef ELF_MACHINE_XHASH_SETUP
64# define ELF_MACHINE_XHASH_SETUP(hash32, symbias, map) \
65 ((void) (hash32), (void) (symbias), (void) (map))
66#endif
67
a42195db
UD
68/* We use this macro to refer to ELF types independent of the native wordsize.
69 `ElfW(TYPE)' is used in place of `Elf32_TYPE' or `Elf64_TYPE'. */
70#define ELFW(type) _ElfW (ELF, __ELF_NATIVE_CLASS, type)
71
72/* All references to the value of l_info[DT_PLTGOT],
73 l_info[DT_STRTAB], l_info[DT_SYMTAB], l_info[DT_RELA],
88fdf42f 74 l_info[DT_REL], l_info[DT_JMPREL], and l_info[VERSYMIDX (DT_VERSYM)]
42ba2c11 75 have to be accessed via the D_PTR macro. The macro is needed since for
88fdf42f
AJ
76 most architectures the entry is already relocated - but for some not
77 and we need to relocate at access time. */
a42195db 78#ifdef DL_RO_DYN_SECTION
9dcafc55 79# define D_PTR(map, i) ((map)->i->d_un.d_ptr + (map)->l_addr)
a42195db 80#else
9dcafc55 81# define D_PTR(map, i) (map)->i->d_un.d_ptr
a42195db
UD
82#endif
83
9dcafc55 84/* Result of the lookup functions and how to retrieve the base address. */
c0282c06 85typedef struct link_map *lookup_t;
93b53ca2 86#define LOOKUP_VALUE(map) map
10a446dd
MR
87#define LOOKUP_VALUE_ADDRESS(map, set) ((set) || (map) ? (map)->l_addr : 0)
88
89/* Calculate the address of symbol REF using the base address from map MAP,
90 if non-NULL. Don't check for NULL map if MAP_SET is TRUE. */
91#define SYMBOL_ADDRESS(map, ref, map_set) \
92 ((ref) == NULL ? 0 \
e7feec37
MR
93 : (__glibc_unlikely ((ref)->st_shndx == SHN_ABS) ? 0 \
94 : LOOKUP_VALUE_ADDRESS (map, map_set)) + (ref)->st_value)
c0282c06 95
0b3cf801 96/* On some architectures a pointer to a function is not just a pointer
c0282c06
UD
97 to the actual code of the function but rather an architecture
98 specific descriptor. */
99#ifndef ELF_FUNCTION_PTR_IS_SPECIAL
09bf6406 100# define DL_SYMBOL_ADDRESS(map, ref) \
10a446dd 101 (void *) SYMBOL_ADDRESS (map, ref, false)
09bf6406 102# define DL_LOOKUP_ADDRESS(addr) ((ElfW(Addr)) (addr))
daf75146
GM
103# define DL_CALL_DT_INIT(map, start, argc, argv, env) \
104 ((init_t) (start)) (argc, argv, env)
105# define DL_CALL_DT_FINI(map, start) ((fini_t) (start)) ()
09bf6406
UD
106#endif
107
0b3cf801
UD
108/* On some architectures dladdr can't use st_size of all symbols this way. */
109#define DL_ADDR_SYM_MATCH(L, SYM, MATCHSYM, ADDR) \
110 ((ADDR) >= (L)->l_addr + (SYM)->st_value \
2ac9ca73 111 && ((((SYM)->st_shndx == SHN_UNDEF || (SYM)->st_size == 0) \
0b3cf801
UD
112 && (ADDR) == (L)->l_addr + (SYM)->st_value) \
113 || (ADDR) < (L)->l_addr + (SYM)->st_value + (SYM)->st_size) \
114 && ((MATCHSYM) == NULL || (MATCHSYM)->st_value < (SYM)->st_value))
115
b6084a95
MR
116/* According to the ELF gABI no STV_HIDDEN or STV_INTERNAL symbols are
117 expected to be present in dynamic symbol tables as they should have
118 been either removed or converted to STB_LOCAL binding by the static
119 linker. However some GNU binutils versions produce such symbols in
120 some cases. To prevent such symbols present in a buggy binary from
121 preempting global symbols we filter them out with this predicate. */
122static __always_inline bool
123dl_symbol_visibility_binds_local_p (const ElfW(Sym) *sym)
124{
125 return (ELFW(ST_VISIBILITY) (sym->st_other) == STV_HIDDEN
126 || ELFW(ST_VISIBILITY) (sym->st_other) == STV_INTERNAL);
127}
128
09bf6406
UD
129/* Unmap a loaded object, called by _dl_close (). */
130#ifndef DL_UNMAP_IS_SPECIAL
fcccd512 131# define DL_UNMAP(map) _dl_unmap_segments (map)
c0282c06
UD
132#endif
133
beb5387c
UD
134/* By default we do not need special support to initialize DSOs loaded
135 by statically linked binaries. */
136#ifndef DL_STATIC_INIT
137# define DL_STATIC_INIT(map)
138#endif
139
cf5a372e
UD
140/* Reloc type classes as returned by elf_machine_type_class().
141 ELF_RTYPE_CLASS_PLT means this reloc should not be satisfied by
142 some PLT symbol, ELF_RTYPE_CLASS_COPY means this reloc should not be
18ef464b
UD
143 satisfied by any symbol in the executable. Some architectures do
144 not support copy relocations. In this case we define the macro to
145 zero so that the code for handling them gets automatically optimized
62da1e3b
L
146 out. ELF_RTYPE_CLASS_EXTERN_PROTECTED_DATA means address of protected
147 data defined in the shared library may be external, i.e., due to copy
148 relocation. */
cf5a372e 149#define ELF_RTYPE_CLASS_PLT 1
18ef464b
UD
150#ifndef DL_NO_COPY_RELOCS
151# define ELF_RTYPE_CLASS_COPY 2
152#else
153# define ELF_RTYPE_CLASS_COPY 0
154#endif
62da1e3b
L
155/* If DL_EXTERN_PROTECTED_DATA is defined, address of protected data
156 defined in the shared library may be external, i.e., due to copy
157 relocation. */
158#ifdef DL_EXTERN_PROTECTED_DATA
159# define ELF_RTYPE_CLASS_EXTERN_PROTECTED_DATA 4
160#else
161# define ELF_RTYPE_CLASS_EXTERN_PROTECTED_DATA 0
162#endif
cf5a372e 163
9d63abbc
UD
164/* ELF uses the PF_x macros to specify the segment permissions, mmap
165 uses PROT_xxx. In most cases the three macros have the values 1, 2,
166 and 3 but not in a matching order. The following macros allows
167 converting from the PF_x values to PROT_xxx values. */
168#define PF_TO_PROT \
169 ((PROT_READ << (PF_R * 4)) \
170 | (PROT_WRITE << (PF_W * 4)) \
171 | (PROT_EXEC << (PF_X * 4)) \
172 | ((PROT_READ | PROT_WRITE) << ((PF_R | PF_W) * 4)) \
173 | ((PROT_READ | PROT_EXEC) << ((PF_R | PF_X) * 4)) \
174 | ((PROT_WRITE | PROT_EXEC) << (PF_W | PF_X) * 4) \
175 | ((PROT_READ | PROT_WRITE | PROT_EXEC) << ((PF_R | PF_W | PF_X) * 4)))
176
b9375348
SP
177/* The filename itself, or the main program name, if available. */
178#define DSO_FILENAME(name) ((name)[0] ? (name) \
179 : (rtld_progname ?: "<main program>"))
180
181#define RTLD_PROGNAME (rtld_progname ?: "<program name unknown>")
9d63abbc 182
a42195db
UD
183/* For the version handling we need an array with only names and their
184 hash values. */
185struct r_found_version
186 {
187 const char *name;
188 ElfW(Word) hash;
189
190 int hidden;
191 const char *filename;
192 };
193
194/* We want to cache information about the searches for shared objects. */
195
196enum r_dir_status { unknown, nonexisting, existing };
197
198struct r_search_path_elem
199 {
200 /* This link is only used in the `all_dirs' member of `r_search_path'. */
201 struct r_search_path_elem *next;
202
203 /* Strings saying where the definition came from. */
204 const char *what;
205 const char *where;
206
207 /* Basename for this search path element. The string must end with
208 a slash character. */
209 const char *dirname;
210 size_t dirnamelen;
211
212 enum r_dir_status status[0];
213 };
214
215struct r_strlenpair
216 {
217 const char *str;
218 size_t len;
219 };
220
221
222/* A data structure for a simple single linked list of strings. */
223struct libname_list
224 {
225 const char *name; /* Name requested (before search). */
226 struct libname_list *next; /* Link to next name for this object. */
752a2a50
UD
227 int dont_free; /* Flag whether this element should be freed
228 if the object is not entirely unloaded. */
a42195db
UD
229 };
230
231
eec8b6ca
UD
232/* Bit masks for the objects which valid callers can come from to
233 functions with restricted interface. */
234enum allowmask
235 {
236 allow_libc = 1,
237 allow_libdl = 2,
238 allow_libpthread = 4,
239 allow_ldso = 8
240 };
241
242
9dcafc55
UD
243struct audit_ifaces
244{
245 void (*activity) (uintptr_t *, unsigned int);
246 char *(*objsearch) (const char *, uintptr_t *, unsigned int);
247 unsigned int (*objopen) (struct link_map *, Lmid_t, uintptr_t *);
248 void (*preinit) (uintptr_t *);
249 union
250 {
251 uintptr_t (*symbind32) (Elf32_Sym *, unsigned int, uintptr_t *,
252 uintptr_t *, unsigned int *, const char *);
253 uintptr_t (*symbind64) (Elf64_Sym *, unsigned int, uintptr_t *,
254 uintptr_t *, unsigned int *, const char *);
255 };
256 union
257 {
dc936e2b
RM
258#ifdef ARCH_PLTENTER_MEMBERS
259 ARCH_PLTENTER_MEMBERS;
260#endif
9dcafc55
UD
261 };
262 union
263 {
dc936e2b
RM
264#ifdef ARCH_PLTEXIT_MEMBERS
265 ARCH_PLTEXIT_MEMBERS;
266#endif
9dcafc55
UD
267 };
268 unsigned int (*objclose) (uintptr_t *);
269
270 struct audit_ifaces *next;
271};
272
273
a42195db 274/* Test whether given NAME matches any of the names of the given object. */
871b9158 275extern int _dl_name_match_p (const char *__name, const struct link_map *__map)
17e00cc6 276 attribute_hidden;
a42195db 277
55c4ce68
UD
278/* Compute next higher prime number. */
279extern unsigned long int _dl_higher_prime_number (unsigned long int n)
17e00cc6 280 attribute_hidden;
55c4ce68 281
37b66c0b 282/* A stripped down strtoul-like implementation. */
17e00cc6 283uint64_t _dl_strtoul (const char *, char **) attribute_hidden;
37b66c0b 284
a42195db
UD
285/* Function used as argument for `_dl_receive_error' function. The
286 arguments are the error code, error string, and the objname the
287 error occurred in. */
288typedef void (*receiver_fct) (int, const char *, const char *);
289\f
290/* Internal functions of the run-time dynamic linker.
291 These can be accessed if you link again the dynamic linker
292 as a shared library, as in `-lld' or `/lib/ld.so' explicitly;
293 but are not normally of interest to user programs.
294
295 The `-ldl' library functions in <dlfcn.h> provide a simple
296 user interface to run-time dynamic linking. */
297
298
d6b5d570
UD
299#ifndef SHARED
300# define EXTERN extern
301# define GL(name) _##name
302#else
303# define EXTERN
a3848485 304# if IS_IN (rtld)
0d01dace
UD
305# define GL(name) _rtld_local._##name
306# else
307# define GL(name) _rtld_global._##name
308# endif
d6b5d570
UD
309struct rtld_global
310{
311#endif
312 /* Don't change the order of the following elements. 'dl_loaded'
313 must remain the first element. Forever. */
314
c0f62c56
UD
315/* Non-shared code has no support for multiple namespaces. */
316#ifdef SHARED
317# define DL_NNS 16
318#else
319# define DL_NNS 1
320#endif
321 EXTERN struct link_namespaces
322 {
9dcafc55 323 /* A pointer to the map for the main map. */
c0f62c56
UD
324 struct link_map *_ns_loaded;
325 /* Number of object in the _dl_loaded list. */
326 unsigned int _ns_nloaded;
c0f62c56
UD
327 /* Direct pointer to the searchlist of the main object. */
328 struct r_scope_elem *_ns_main_searchlist;
329 /* This is zero at program start to signal that the global scope map is
330 allocated by rtld. Later it keeps the size of the map. It might be
331 reset if in _dl_close if the last global object is removed. */
440b7f86
FW
332 unsigned int _ns_global_scope_alloc;
333
334 /* During dlopen, this is the number of objects that still need to
335 be added to the global scope map. It has to be taken into
336 account when resizing the map, for future map additions after
337 recursive dlopen calls from ELF constructors. */
338 unsigned int _ns_global_scope_pending_adds;
339
ec935dea
FW
340 /* Once libc.so has been loaded into the namespace, this points to
341 its link map. */
342 struct link_map *libc_map;
343
415ac3df
UD
344 /* Search table for unique objects. */
345 struct unique_sym_table
346 {
bea9b193 347 __rtld_lock_define_recursive (, lock)
415ac3df
UD
348 struct unique_sym
349 {
350 uint32_t hashval;
351 const char *name;
352 const ElfW(Sym) *sym;
5e4287d1 353 const struct link_map *map;
415ac3df
UD
354 } *entries;
355 size_t size;
356 size_t n_elements;
357 void (*free) (void *);
358 } _ns_unique_sym_table;
29f97654
UD
359 /* Keep track of changes to each namespace' list. */
360 struct r_debug _ns_debug;
c0f62c56 361 } _dl_ns[DL_NNS];
22c83193
UD
362 /* One higher than index of last used namespace. */
363 EXTERN size_t _dl_nns;
d6b5d570 364
5688da55
UD
365 /* During the program run we must not modify the global data of
366 loaded shared object simultanously in two threads. Therefore we
367 protect `_dl_open' and `_dl_close' in dl-close.c.
368
369 This must be a recursive lock since the initializer function of
370 the loaded object might as well require a call to this function.
371 At this time it is not anymore a problem to modify the tables. */
d3c9f895 372 __rtld_lock_define_recursive (EXTERN, _dl_load_lock)
5a2a1d75
AS
373 /* This lock is used to keep __dl_iterate_phdr from inspecting the
374 list of loaded objects while an object is added to or removed
375 from that list. */
376 __rtld_lock_define_recursive (EXTERN, _dl_load_write_lock)
5688da55 377
bed12f78
UD
378 /* Incremented whenever something may have been added to dl_loaded. */
379 EXTERN unsigned long long _dl_load_adds;
bed12f78 380
d6b5d570
UD
381 /* The object to be initialized first. */
382 EXTERN struct link_map *_dl_initfirst;
383
d6b5d570
UD
384 /* Map of shared object to be profiled. */
385 EXTERN struct link_map *_dl_profile_map;
d6b5d570
UD
386
387 /* Counters for the number of relocations performed. */
388 EXTERN unsigned long int _dl_num_relocations;
389 EXTERN unsigned long int _dl_num_cache_relocations;
390
d6b5d570
UD
391 /* List of search directories. */
392 EXTERN struct r_search_path_elem *_dl_all_dirs;
d6b5d570 393
e21a7867 394 /* Structure describing the dynamic linker itself. */
d6b5d570 395 EXTERN struct link_map _dl_rtld_map;
9dcafc55 396#ifdef SHARED
e21a7867
FW
397 /* Used to store the audit information for the link map of the
398 dynamic loader. */
399 struct auditstate _dl_rtld_auditstate[DL_NNS];
9dcafc55 400#endif
ce460d04 401
334fcf2a
UD
402#if defined SHARED && defined _LIBC_REENTRANT \
403 && defined __rtld_lock_default_lock_recursive
404 EXTERN void (*_dl_rtld_lock_recursive) (void *);
405 EXTERN void (*_dl_rtld_unlock_recursive) (void *);
406#endif
407
4a306ef1
L
408 /* Get architecture specific definitions. */
409#define PROCINFO_DECL
410#ifndef PROCINFO_CLASS
411# define PROCINFO_CLASS EXTERN
412#endif
413#include <dl-procruntime.c>
414
ecdeaac0
RM
415 /* If loading a shared object requires that we make the stack executable
416 when it was not, we do it by calling this function.
417 It returns an errno code or zero on success. */
e1d2ae8d 418 EXTERN int (*_dl_make_stack_executable_hook) (void **);
ecdeaac0 419
9be09e06
UD
420 /* Prevailing state of the stack, PF_X indicating it's executable. */
421 EXTERN ElfW(Word) _dl_stack_flags;
422
11bf311e
UD
423 /* Flag signalling whether there are gaps in the module ID allocation. */
424 EXTERN bool _dl_tls_dtv_gaps;
9be09e06
UD
425 /* Highest dtv index currently needed. */
426 EXTERN size_t _dl_tls_max_dtv_idx;
68dc80ca
RM
427 /* Information about the dtv slots. */
428 EXTERN struct dtv_slotinfo_list
429 {
430 size_t len;
431 struct dtv_slotinfo_list *next;
432 struct dtv_slotinfo
433 {
434 size_t gen;
435 struct link_map *map;
cba932a5 436 } slotinfo[];
68dc80ca
RM
437 } *_dl_tls_dtv_slotinfo_list;
438 /* Number of modules in the static TLS block. */
439 EXTERN size_t _dl_tls_static_nelem;
440 /* Size of the static TLS block. */
441 EXTERN size_t _dl_tls_static_size;
442 /* Size actually allocated in the static TLS block. */
443 EXTERN size_t _dl_tls_static_used;
444 /* Alignment requirement of the static TLS block. */
445 EXTERN size_t _dl_tls_static_align;
ffb17e7b
SN
446 /* Remaining amount of static TLS that may be used for optimizing
447 dynamic TLS access (e.g. with TLSDESC). */
448 EXTERN size_t _dl_tls_static_optional;
68dc80ca
RM
449
450/* Number of additional entries in the slotinfo array of each slotinfo
451 list element. A large number makes it almost certain take we never
452 have to iterate beyond the first element in the slotinfo list. */
11bf311e 453#define TLS_SLOTINFO_SURPLUS (62)
68dc80ca
RM
454
455/* Number of additional slots in the dtv allocated. */
11bf311e 456#define DTV_SURPLUS (14)
68dc80ca
RM
457
458 /* Initial dtv of the main thread, not allocated with normal malloc. */
459 EXTERN void *_dl_initial_dtv;
460 /* Generation counter for the dtv. */
461 EXTERN size_t _dl_tls_generation;
adc12574
UD
462
463 EXTERN void (*_dl_init_static_tls) (struct link_map *);
68dc80ca 464
e4eb675d
UD
465 /* Scopes to free after next THREAD_GSCOPE_WAIT (). */
466 EXTERN struct dl_scope_free_list
467 {
468 size_t count;
385b4cf4 469 void *list[50];
e4eb675d 470 } *_dl_scope_free_list;
1daccf40
FW
471#if THREAD_GSCOPE_IN_TCB
472 /* List of active thread stacks, with memory managed by glibc. */
473 EXTERN list_t _dl_stack_used;
474
475 /* List of thread stacks that were allocated by the application. */
476 EXTERN list_t _dl_stack_user;
477
478 /* Mutex protecting the stack lists. */
479 EXTERN int _dl_stack_cache_lock;
480#else
a5df0318
ST
481 EXTERN int _dl_thread_gscope_count;
482#endif
d6b5d570
UD
483#ifdef SHARED
484};
5fe14d96 485# define __rtld_global_attribute__
a3848485 486# if IS_IN (rtld)
11bf311e
UD
487# ifdef HAVE_SDATA_SECTION
488# define __rtld_local_attribute__ \
0d01dace 489 __attribute__ ((visibility ("hidden"), section (".sdata")))
11bf311e
UD
490# undef __rtld_global_attribute__
491# define __rtld_global_attribute__ __attribute__ ((section (".sdata")))
0d01dace 492# else
11bf311e 493# define __rtld_local_attribute__ __attribute__ ((visibility ("hidden")))
0d01dace
UD
494# endif
495extern struct rtld_global _rtld_local __rtld_local_attribute__;
021723ab 496# undef __rtld_local_attribute__
0d01dace 497# endif
5fe14d96 498extern struct rtld_global _rtld_global __rtld_global_attribute__;
021723ab 499# undef __rtld_global_attribute__
d6b5d570 500#endif
20c37dfd
UD
501
502#ifndef SHARED
503# define GLRO(name) _##name
504#else
a3848485 505# if IS_IN (rtld)
20c37dfd
UD
506# define GLRO(name) _rtld_local_ro._##name
507# else
508# define GLRO(name) _rtld_global_ro._##name
509# endif
510struct rtld_global_ro
511{
512#endif
513
514 /* If nonzero the appropriate debug information is printed. */
515 EXTERN int _dl_debug_mask;
516#define DL_DEBUG_LIBS (1 << 0)
517#define DL_DEBUG_IMPCALLS (1 << 1)
518#define DL_DEBUG_BINDINGS (1 << 2)
519#define DL_DEBUG_SYMBOLS (1 << 3)
520#define DL_DEBUG_VERSIONS (1 << 4)
521#define DL_DEBUG_RELOC (1 << 5)
522#define DL_DEBUG_FILES (1 << 6)
523#define DL_DEBUG_STATISTICS (1 << 7)
7a11603d 524#define DL_DEBUG_UNUSED (1 << 8)
73d7af4f 525#define DL_DEBUG_SCOPES (1 << 9)
20c37dfd 526/* These two are used only internally. */
73d7af4f
UD
527#define DL_DEBUG_HELP (1 << 10)
528#define DL_DEBUG_PRELINK (1 << 11)
20c37dfd 529
20c37dfd
UD
530 /* OS version. */
531 EXTERN unsigned int _dl_osversion;
532 /* Platform name. */
533 EXTERN const char *_dl_platform;
534 EXTERN size_t _dl_platformlen;
535
9be09e06
UD
536 /* Cached value of `getpagesize ()'. */
537 EXTERN size_t _dl_pagesize;
538
73d65cc3
SP
539 /* Do we read from ld.so.cache? */
540 EXTERN int _dl_inhibit_cache;
541
c31e278f
UD
542 /* Copy of the content of `_dl_main_searchlist' at startup time. */
543 EXTERN struct r_scope_elem _dl_initial_searchlist;
544
20c37dfd
UD
545 /* CLK_TCK as reported by the kernel. */
546 EXTERN int _dl_clktck;
547
548 /* If nonzero print warnings messages. */
549 EXTERN int _dl_verbose;
550
dd70526e
UD
551 /* File descriptor to write debug messages to. */
552 EXTERN int _dl_debug_fd;
553
20c37dfd
UD
554 /* Do we do lazy relocations? */
555 EXTERN int _dl_lazy;
556
557 /* Nonzero if runtime lookups should not update the .got/.plt. */
558 EXTERN int _dl_bind_not;
559
560 /* Nonzero if references should be treated as weak during runtime
561 linking. */
562 EXTERN int _dl_dynamic_weak;
563
564 /* Default floating-point control word. */
565 EXTERN fpu_control_t _dl_fpu_control;
566
567 /* Expected cache ID. */
568 EXTERN int _dl_correct_cache_id;
569
570 /* Mask for hardware capabilities that are available. */
404a4e2f 571 EXTERN uint64_t _dl_hwcap;
20c37dfd 572
ff08fc59 573#if !HAVE_TUNABLES
20c37dfd 574 /* Mask for important hardware capabilities we honour. */
404a4e2f 575 EXTERN uint64_t _dl_hwcap_mask;
ff08fc59 576#endif
20c37dfd 577
0cdc5e93 578#ifdef HAVE_AUX_VECTOR
c7683a6d
RH
579 /* Pointer to the auxv list supplied to the program at startup. */
580 EXTERN ElfW(auxv_t) *_dl_auxv;
0cdc5e93 581#endif
c7683a6d 582
c31e278f 583 /* Get architecture specific definitions. */
c31e278f
UD
584#include <dl-procinfo.c>
585
20c37dfd
UD
586 /* Names of shared object for which the RPATH should be ignored. */
587 EXTERN const char *_dl_inhibit_rpath;
588
589 /* Location of the binary. */
590 EXTERN const char *_dl_origin_path;
591
592 /* -1 if the dynamic linker should honor library load bias,
593 0 if not, -2 use the default (honor biases for normal
594 binaries, don't honor for PIEs). */
595 EXTERN ElfW(Addr) _dl_use_load_bias;
596
0c7b002f
SN
597 /* Size of surplus space in the static TLS area for dynamically
598 loaded modules with IE-model TLS or for TLSDESC optimization.
599 See comments in elf/dl-tls.c where it is initialized. */
600 EXTERN size_t _dl_tls_static_surplus;
601
20c37dfd
UD
602 /* Name of the shared object to be profiled (if any). */
603 EXTERN const char *_dl_profile;
604 /* Filename of the output file. */
605 EXTERN const char *_dl_profile_output;
606 /* Name of the object we want to trace the prelinking. */
607 EXTERN const char *_dl_trace_prelink;
608 /* Map of shared object to be prelink traced. */
609 EXTERN struct link_map *_dl_trace_prelink_map;
c31e278f 610
8e1472d2
FW
611 /* All search directories defined at startup. This is assigned a
612 non-NULL pointer by the ld.so startup code (after initialization
613 to NULL), so this can also serve as an indicator whether a copy
614 of ld.so is initialized and active. See the rtld_active function
615 below. */
c31e278f
UD
616 EXTERN struct r_search_path_elem *_dl_init_all_dirs;
617
20c37dfd
UD
618#ifdef NEED_DL_SYSINFO
619 /* Syscall handling improvements. This is very specific to x86. */
620 EXTERN uintptr_t _dl_sysinfo;
30e32d23 621#endif
20c37dfd 622
7775448e 623#ifdef NEED_DL_SYSINFO_DSO
20c37dfd
UD
624 /* The vsyscall page is a virtual DSO pre-mapped by the kernel.
625 This points to its ELF header. */
626 EXTERN const ElfW(Ehdr) *_dl_sysinfo_dso;
404a4e2f
RM
627
628 /* At startup time we set up the normal DSO data structure for it,
629 and this points to it. */
630 EXTERN struct link_map *_dl_sysinfo_map;
1bdda52f
AZ
631
632# define PROCINFO_DECL
633# ifndef PROCINFO_CLASS
634# define PROCINFO_CLASS EXTERN
635# endif
636# include <dl-vdso-setup.c>
20c37dfd
UD
637#endif
638
1ae8bfe0
RA
639 /* Mask for more hardware capabilities that are available on some
640 platforms. */
641 EXTERN uint64_t _dl_hwcap2;
642
20c37dfd 643#ifdef SHARED
154d10bd
UD
644 /* We add a function table to _rtld_global which is then used to
645 call the function instead of going through the PLT. The result
646 is that we can avoid exporting the functions and we do not jump
647 PLT relocations in libc.so. */
154d10bd
UD
648 void (*_dl_debug_printf) (const char *, ...)
649 __attribute__ ((__format__ (__printf__, 1, 2)));
154d10bd 650 void (*_dl_mcount) (ElfW(Addr) frompc, ElfW(Addr) selfpc);
17e00cc6
FW
651 lookup_t (*_dl_lookup_symbol_x) (const char *, struct link_map *,
652 const ElfW(Sym) **, struct r_scope_elem *[],
653 const struct r_found_version *, int, int,
654 struct link_map *);
9dcafc55
UD
655 void *(*_dl_open) (const char *file, int mode, const void *caller_dlopen,
656 Lmid_t nsid, int argc, char *argv[], char *env[]);
657 void (*_dl_close) (void *map);
93025f93 658 void *(*_dl_tls_get_addr_soft) (struct link_map *);
7c22c7ec
UD
659#ifdef HAVE_DL_DISCOVER_OSVERSION
660 int (*_dl_discover_osversion) (void);
661#endif
154d10bd 662
9dcafc55
UD
663 /* List of auditing interfaces. */
664 struct audit_ifaces *_dl_audit;
665 unsigned int _dl_naudit;
20c37dfd
UD
666};
667# define __rtld_global_attribute__
a3848485 668# if IS_IN (rtld)
11bf311e 669# define __rtld_local_attribute__ __attribute__ ((visibility ("hidden")))
20c37dfd
UD
670extern struct rtld_global_ro _rtld_local_ro
671 attribute_relro __rtld_local_attribute__;
20c37dfd
UD
672extern struct rtld_global_ro _rtld_global_ro
673 attribute_relro __rtld_global_attribute__;
021723ab 674# undef __rtld_local_attribute__
154d10bd
UD
675# else
676/* We cheat a bit here. We declare the variable as as const even
677 though it is at startup. */
678extern const struct rtld_global_ro _rtld_global_ro
679 attribute_relro __rtld_global_attribute__;
680# endif
021723ab 681# undef __rtld_global_attribute__
20c37dfd 682#endif
d6b5d570
UD
683#undef EXTERN
684
3d3436ae
RM
685#ifndef SHARED
686/* dl-support.c defines these and initializes them early on. */
dc0a0263 687extern const ElfW(Phdr) *_dl_phdr;
3d3436ae
RM
688extern size_t _dl_phnum;
689#endif
690
ecdeaac0
RM
691/* This is the initial value of GL(dl_make_stack_executable_hook).
692 A threads library can change it. */
e1d2ae8d 693extern int _dl_make_stack_executable (void **stack_endp);
ecdeaac0
RM
694rtld_hidden_proto (_dl_make_stack_executable)
695
ea4f25a7
UD
696/* Variable pointing to the end of the stack (or close to it). This value
697 must be constant over the runtime of the application. Some programs
698 might use the variable which results in copy relocations on some
699 platforms. But this does not matter, ld.so can always use the local
700 copy. */
5d5722e8
ST
701extern void *__libc_stack_end
702#ifndef LIBC_STACK_END_NOT_RELRO
703 attribute_relro
704#endif
705 ;
ea4f25a7
UD
706rtld_hidden_proto (__libc_stack_end)
707
d6b5d570 708/* Parameters passed to the dynamic linker. */
392a6b52 709extern int _dl_argc attribute_hidden attribute_relro;
33ab3b66
UD
710extern char **_dl_argv
711#ifndef DL_ARGV_NOT_RELRO
712 attribute_relro
713#endif
714 ;
4243cbea 715rtld_hidden_proto (_dl_argv)
a3848485 716#if IS_IN (rtld)
8347c74c
RM
717extern unsigned int _dl_skip_args attribute_hidden
718# ifndef DL_ARGV_NOT_RELRO
719 attribute_relro
720# endif
721 ;
722extern unsigned int _dl_skip_args_internal attribute_hidden
723# ifndef DL_ARGV_NOT_RELRO
724 attribute_relro
725# endif
726 ;
e6caf4e1 727#endif
4243cbea 728#define rtld_progname _dl_argv[0]
d6b5d570 729
5bbcba0d
RM
730/* Flag set at startup and cleared when the last initializer has run. */
731extern int _dl_starting_up;
732weak_extern (_dl_starting_up)
9cf27b8d 733rtld_hidden_proto (_dl_starting_up)
f55727ca 734
965cb60a 735/* Random data provided by the kernel. */
d09580b1 736extern void *_dl_random attribute_hidden attribute_relro;
965cb60a 737
b5ba0659
UD
738/* Write message on the debug file descriptor. The parameters are
739 interpreted as for a `printf' call. All the lines start with a
740 tag showing the PID. */
741extern void _dl_debug_printf (const char *fmt, ...)
154d10bd 742 __attribute__ ((__format__ (__printf__, 1, 2))) attribute_hidden;
b5ba0659
UD
743
744/* Write message on the debug file descriptor. The parameters are
745 interpreted as for a `printf' call. All the lines buf the first
746 start with a tag showing the PID. */
747extern void _dl_debug_printf_c (const char *fmt, ...)
58c9ff1b 748 __attribute__ ((__format__ (__printf__, 1, 2))) attribute_hidden;
b5ba0659
UD
749
750
751/* Write a message on the specified descriptor FD. The parameters are
752 interpreted as for a `printf' call. */
9e78f6f6 753#if IS_IN (rtld) || !defined (SHARED)
b5ba0659 754extern void _dl_dprintf (int fd, const char *fmt, ...)
6ce3881d
RM
755 __attribute__ ((__format__ (__printf__, 2, 3)))
756 attribute_hidden;
9e78f6f6
FW
757#else
758__attribute__ ((always_inline, __format__ (__printf__, 2, 3)))
759static inline void
760_dl_dprintf (int fd, const char *fmt, ...)
761{
762 /* Use local declaration to avoid includign <stdio.h>. */
763 extern int __dprintf(int fd, const char *format, ...) attribute_hidden;
764 __dprintf (fd, fmt, __builtin_va_arg_pack ());
765}
766#endif
b5ba0659 767
b31d4355
FW
768/* Write LENGTH bytes at BUFFER to FD, like write. Returns the number
769 of bytes written on success, or a negative error constant on
770 failure. */
771ssize_t _dl_write (int fd, const void *buffer, size_t length)
772 attribute_hidden;
773
b5ba0659
UD
774/* Write a message on the specified descriptor standard output. The
775 parameters are interpreted as for a `printf' call. */
de426135
FW
776void _dl_printf (const char *fmt, ...)
777 attribute_hidden __attribute__ ((__format__ (__printf__, 1, 2)));
b5ba0659
UD
778
779/* Write a message on the specified descriptor standard error. The
780 parameters are interpreted as for a `printf' call. */
de426135
FW
781void _dl_error_printf (const char *fmt, ...)
782 attribute_hidden __attribute__ ((__format__ (__printf__, 1, 2)));
b5ba0659
UD
783
784/* Write a message on the specified descriptor standard error and exit
785 the program. The parameters are interpreted as for a `printf' call. */
de426135
FW
786void _dl_fatal_printf (const char *fmt, ...)
787 __attribute__ ((__format__ (__printf__, 1, 2), __noreturn__));
788rtld_hidden_proto (_dl_fatal_printf)
a42195db 789
2449ae7b
FW
790/* An exception raised by the _dl_signal_error function family and
791 caught by _dl_catch_error function family. Exceptions themselves
792 are copied as part of the raise operation, but the strings are
793 not. */
794struct dl_exception
795{
796 const char *objname;
797 const char *errstring;
798
799 /* This buffer typically stores both objname and errstring
800 above. */
801 char *message_buffer;
802};
803
804/* Creates a new exception. This calls malloc; if allocation fails,
805 dummy values are inserted. OBJECT is the name of the problematical
806 shared object, or null if its a general problem. ERRSTRING is a
807 string describing the specific problem. */
808void _dl_exception_create (struct dl_exception *, const char *object,
809 const char *errstring)
810 __attribute__ ((nonnull (1, 3)));
811rtld_hidden_proto (_dl_exception_create)
812
813/* Like _dl_exception_create, but create errstring from a format
814 string FMT. Currently, only "%s" and "%%" are supported as format
815 directives. */
816void _dl_exception_create_format (struct dl_exception *, const char *objname,
817 const char *fmt, ...)
818 __attribute__ ((nonnull (1, 3), format (printf, 3, 4)));
819rtld_hidden_proto (_dl_exception_create_format)
820
821/* Deallocate the exception, freeing allocated buffers (if
822 possible). */
823void _dl_exception_free (struct dl_exception *)
824 __attribute__ ((nonnull (1)));
825rtld_hidden_proto (_dl_exception_free)
826
827/* This function is called by all the internal dynamic linker
828 functions when they encounter an error. ERRCODE is either an
829 `errno' code or zero; it specifies the return value of
830 _dl_catch_error. OCCASION is included in the error message if the
831 process is terminated immediately. */
832void _dl_signal_exception (int errcode, struct dl_exception *,
833 const char *occasion)
834 __attribute__ ((__noreturn__));
835libc_hidden_proto (_dl_signal_exception)
836
837/* Like _dl_signal_exception, but creates the exception first. */
8e17ea58 838extern void _dl_signal_error (int errcode, const char *object,
2449ae7b 839 const char *occasion, const char *errstring)
3012cfb0 840 __attribute__ ((__noreturn__));
9e78f6f6 841libc_hidden_proto (_dl_signal_error)
a42195db 842
2449ae7b
FW
843/* Like _dl_signal_exception, but may return when called in the
844 context of _dl_receive_error. This is only used during ld.so
845 bootstrap. In static and profiled builds, this is equivalent to
846 _dl_signal_exception. */
847#if IS_IN (rtld)
848extern void _dl_signal_cexception (int errcode, struct dl_exception *,
849 const char *occasion) attribute_hidden;
850#else
851__attribute__ ((always_inline))
852static inline void
853_dl_signal_cexception (int errcode, struct dl_exception *exception,
854 const char *occasion)
855{
856 _dl_signal_exception (errcode, exception, occasion);
857}
858#endif
859
860/* See _dl_signal_cexception above. */
9e78f6f6 861#if IS_IN (rtld)
407fe3bb 862extern void _dl_signal_cerror (int errcode, const char *object,
2449ae7b 863 const char *occasion, const char *errstring)
3012cfb0 864 attribute_hidden;
9e78f6f6
FW
865#else
866__attribute__ ((always_inline))
867static inline void
868_dl_signal_cerror (int errcode, const char *object,
2449ae7b 869 const char *occasion, const char *errstring)
9e78f6f6 870{
2449ae7b 871 _dl_signal_error (errcode, object, occasion, errstring);
9e78f6f6
FW
872}
873#endif
a42195db
UD
874
875/* Call OPERATE, receiving errors from `dl_signal_cerror'. Unlike
876 `_dl_catch_error' the operation is resumed after the OPERATE
877 function returns.
878 ARGS is passed as argument to OPERATE. */
879extern void _dl_receive_error (receiver_fct fct, void (*operate) (void *),
3012cfb0 880 void *args) attribute_hidden;
a42195db 881
2449ae7b
FW
882/* Call OPERATE, catching errors from `_dl_signal_error' and related
883 functions. If there is no error, *ERRSTRING is set to null. If
884 there is an error, *ERRSTRING is set to a string constructed from
885 the strings passed to _dl_signal_error, and the error code passed
886 is the return value and *OBJNAME is set to the object name which
887 experienced the problems. ERRSTRING if nonzero points to a
888 malloc'ed string which the caller has to free after use. ARGS is
889 passed as argument to OPERATE. MALLOCEDP is set to true only if
890 the returned string is allocated using the libc's malloc. */
d6e855d8
L
891extern int _dl_catch_error (const char **objname, const char **errstring,
892 bool *mallocedp, void (*operate) (void *),
3012cfb0 893 void *args);
9e78f6f6 894libc_hidden_proto (_dl_catch_error)
a42195db 895
2449ae7b
FW
896/* Call OPERATE (ARGS). If no error occurs, set *EXCEPTION to zero.
897 Otherwise, store a copy of the raised exception in *EXCEPTION,
2a764c6e
FW
898 which has to be freed by _dl_exception_free. As a special case, if
899 EXCEPTION is null, call OPERATE (ARGS) with exception handling
900 disabled (so that exceptions are fatal). */
2449ae7b
FW
901int _dl_catch_exception (struct dl_exception *exception,
902 void (*operate) (void *), void *args);
903libc_hidden_proto (_dl_catch_exception)
904
a42195db
UD
905/* Open the shared object NAME and map in its segments.
906 LOADER's DT_RPATH is used in searching for NAME.
8e9f92e9 907 If the object is already opened, returns its existing map. */
a42195db 908extern struct link_map *_dl_map_object (struct link_map *loader,
8e9f92e9 909 const char *name,
c0f62c56 910 int type, int trace_mode, int mode,
17e00cc6 911 Lmid_t nsid) attribute_hidden;
a42195db
UD
912
913/* Call _dl_map_object on the dependencies of MAP, and set up
914 MAP->l_searchlist. PRELOADS points to a vector of NPRELOADS previously
915 loaded objects that will be inserted into MAP->l_searchlist after MAP
916 but before its dependencies. */
917extern void _dl_map_object_deps (struct link_map *map,
918 struct link_map **preloads,
87837aac
UD
919 unsigned int npreloads, int trace_mode,
920 int open_mode)
17e00cc6 921 attribute_hidden;
a42195db
UD
922
923/* Cache the locations of MAP's hash table. */
17e00cc6 924extern void _dl_setup_hash (struct link_map *map) attribute_hidden;
a42195db
UD
925
926
45e4762c
RM
927/* Collect the directories in the search path for LOADER's dependencies.
928 The data structure is defined in <dlfcn.h>. If COUNTING is true,
929 SI->dls_cnt and SI->dls_size are set; if false, those must be as set
930 by a previous call with COUNTING set, and SI must point to SI->dls_size
931 bytes to be used in filling in the result. */
932extern void _dl_rtld_di_serinfo (struct link_map *loader,
17e00cc6 933 Dl_serinfo *si, bool counting);
45e4762c 934
c7aa8596 935/* Process PT_GNU_PROPERTY program header PH in module L after
c00452d7
SN
936 PT_LOAD segments are mapped from file FD. */
937void _dl_process_pt_gnu_property (struct link_map *l, int fd,
938 const ElfW(Phdr) *ph);
c7aa8596 939
45e4762c 940
a42195db
UD
941/* Search loaded objects' symbol tables for a definition of the symbol
942 referred to by UNDEF. *SYM is the symbol table entry containing the
943 reference; it is replaced with the defining symbol, and the base load
944 address of the defining object is returned. SYMBOL_SCOPE is a
945 null-terminated list of object scopes to search; each object's
946 l_searchlist (i.e. the segment of the dependency tree starting at that
947 object) is searched in turn. REFERENCE_NAME should name the object
948 containing the reference; it is used in error messages.
cf5a372e 949 TYPE_CLASS describes the type of symbol we are looking for. */
f9f2a150
UD
950enum
951 {
952 /* If necessary add dependency between user and provider object. */
953 DL_LOOKUP_ADD_DEPENDENCY = 1,
954 /* Return most recent version instead of default version for
955 unversioned lookup. */
b90395e6
UD
956 DL_LOOKUP_RETURN_NEWEST = 2,
957 /* Set if dl_lookup* called with GSCOPE lock held. */
958 DL_LOOKUP_GSCOPE_LOCK = 4,
fcb04b9a
FW
959 /* Set if dl_lookup is called for non-lazy relocation processing
960 from _dl_relocate_object in elf/dl-reloc.c. */
961 DL_LOOKUP_FOR_RELOCATE = 8,
f9f2a150
UD
962 };
963
a42195db 964/* Lookup versioned symbol. */
021723ab
UD
965extern lookup_t _dl_lookup_symbol_x (const char *undef,
966 struct link_map *undef_map,
967 const ElfW(Sym) **sym,
968 struct r_scope_elem *symbol_scope[],
969 const struct r_found_version *version,
4e35ef2c 970 int type_class, int flags,
021723ab 971 struct link_map *skip_map)
17e00cc6 972 attribute_hidden;
a42195db 973
a42195db 974
ec935dea
FW
975/* Restricted version of _dl_lookup_symbol_x. Searches MAP (and only
976 MAP) for the symbol UNDEF_NAME, with GNU hash NEW_HASH (computed
977 with dl_new_hash), symbol version VERSION, and symbol version hash
978 VERSION_HASH (computed with _dl_elf_hash). Returns a pointer to
979 the symbol table entry in MAP on success, or NULL on failure. MAP
980 must have symbol versioning information, or otherwise the result is
981 undefined. */
982const ElfW(Sym) *_dl_lookup_direct (struct link_map *map,
983 const char *undef_name,
984 uint32_t new_hash,
985 const char *version,
986 uint32_t version_hash) attribute_hidden;
987
f0967738
AK
988/* Add the new link_map NEW to the end of the namespace list. */
989extern void _dl_add_to_namespace_list (struct link_map *new, Lmid_t nsid)
17e00cc6 990 attribute_hidden;
f0967738
AK
991
992/* Allocate a `struct link_map' for a new object being loaded. */
a42195db 993extern struct link_map *_dl_new_object (char *realname, const char *libname,
1fc07491 994 int type, struct link_map *loader,
c0f62c56 995 int mode, Lmid_t nsid)
17e00cc6 996 attribute_hidden;
a42195db
UD
997
998/* Relocate the given object (if it hasn't already been).
999 SCOPE is passed to _dl_lookup_symbol in symbol lookups.
2ca285b0 1000 If RTLD_LAZY is set in RELOC-MODE, don't relocate its PLT. */
a42195db
UD
1001extern void _dl_relocate_object (struct link_map *map,
1002 struct r_scope_elem *scope[],
2ca285b0 1003 int reloc_mode, int consider_profiling)
6ce3881d 1004 attribute_hidden;
a42195db 1005
e8648a5a 1006/* Protect PT_GNU_RELRO area. */
17e00cc6 1007extern void _dl_protect_relro (struct link_map *map) attribute_hidden;
e8648a5a 1008
a42195db
UD
1009/* Call _dl_signal_error with a message about an unhandled reloc type.
1010 TYPE is the result of ELFW(R_TYPE) (r_info), i.e. an R_<CPU>_* value.
1011 PLT is nonzero if this was a PLT reloc; it just affects the message. */
1012extern void _dl_reloc_bad_type (struct link_map *map,
ea41b926 1013 unsigned int type, int plt)
17e00cc6 1014 attribute_hidden __attribute__ ((__noreturn__));
a42195db 1015
32e6df36
UD
1016/* Resolve conflicts if prelinking. */
1017extern void _dl_resolve_conflicts (struct link_map *l,
1018 ElfW(Rela) *conflict,
58c9ff1b
L
1019 ElfW(Rela) *conflictend)
1020 attribute_hidden;
32e6df36 1021
a42195db
UD
1022/* Check the version dependencies of all objects available through
1023 MAP. If VERBOSE print some more diagnostics. */
145b8413 1024extern int _dl_check_all_versions (struct link_map *map, int verbose,
17e00cc6 1025 int trace_mode) attribute_hidden;
a42195db
UD
1026
1027/* Check the version dependencies for MAP. If VERBOSE print some more
1028 diagnostics. */
145b8413 1029extern int _dl_check_map_versions (struct link_map *map, int verbose,
17e00cc6 1030 int trace_mode) attribute_hidden;
a42195db 1031
dacc8ffa
UD
1032/* Initialize the object in SCOPE by calling the constructors with
1033 ARGC, ARGV, and ENV as the parameters. */
1034extern void _dl_init (struct link_map *main_map, int argc, char **argv,
b3f85fd2 1035 char **env) attribute_hidden;
a42195db
UD
1036
1037/* Call the finalizer functions of all shared objects whose
1038 initializer functions have completed. */
8bcdb7e0 1039extern void _dl_fini (void) attribute_hidden;
a42195db 1040
c3381f3e 1041/* Sort array MAPS according to dependencies of the contained objects. */
c2c299fd
AS
1042extern void _dl_sort_maps (struct link_map **maps, unsigned int nmaps,
1043 char *used, bool for_fini) attribute_hidden;
c3381f3e 1044
a42195db
UD
1045/* The dynamic linker calls this function before and having changing
1046 any shared object mappings. The `r_state' member of `struct r_debug'
1047 says what change is taking place. This function's address is
1048 the value of the `r_brk' member. */
7e46ec8c
UD
1049extern void _dl_debug_state (void);
1050rtld_hidden_proto (_dl_debug_state)
a42195db
UD
1051
1052/* Initialize `struct r_debug' if it has not already been done. The
1053 argument is the run-time load address of the dynamic linker, to be put
1054 in the `r_ldbase' member. Returns the address of the structure. */
29f97654 1055extern struct r_debug *_dl_debug_initialize (ElfW(Addr) ldbase, Lmid_t ns)
17e00cc6 1056 attribute_hidden;
a42195db 1057
27316f4a 1058/* Initialize the basic data structure for the search paths. SOURCE
dad90d52
FW
1059 is either "LD_LIBRARY_PATH" or "--library-path".
1060 GLIBC_HWCAPS_PREPEND adds additional glibc-hwcaps subdirectories to
1061 search. GLIBC_HWCAPS_MASK is used to filter the built-in
1062 subdirectories if not NULL. */
1063extern void _dl_init_paths (const char *library_path, const char *source,
1064 const char *glibc_hwcaps_prepend,
1065 const char *glibc_hwcaps_mask)
27316f4a 1066 attribute_hidden;
a42195db
UD
1067
1068/* Gather the information needed to install the profiling tables and start
1069 the timers. */
17e00cc6 1070extern void _dl_start_profile (void) attribute_hidden;
a42195db
UD
1071
1072/* The actual functions used to keep book on the calls. */
1073extern void _dl_mcount (ElfW(Addr) frompc, ElfW(Addr) selfpc);
ab97ee8f 1074rtld_hidden_proto (_dl_mcount)
a42195db
UD
1075
1076/* This function is simply a wrapper around the _dl_mcount function
1077 which does not require a FROMPC parameter since this is the
1078 calling function. */
1079extern void _dl_mcount_wrapper (void *selfpc);
1080
1081/* Show the members of the auxiliary array passed up from the kernel. */
17e00cc6 1082extern void _dl_show_auxv (void) attribute_hidden;
a42195db
UD
1083
1084/* Return all environment variables starting with `LD_', one after the
1085 other. */
17e00cc6 1086extern char *_dl_next_ld_env_entry (char ***position) attribute_hidden;
a42195db 1087
bb5fd5ce 1088/* Return an array with the names of the important hardware
dad90d52
FW
1089 capabilities. PREPEND is a colon-separated list of glibc-hwcaps
1090 directories to search first. MASK is a colon-separated list used
1091 to filter the built-in glibc-hwcaps subdirectories. The length of
1092 the array is written to *SZ, and the maximum of all strings length
1093 is written to *MAX_CAPSTRLEN. */
1094const struct r_strlenpair *_dl_important_hwcaps (const char *prepend,
1095 const char *mask,
1096 size_t *sz,
bb5fd5ce
FW
1097 size_t *max_capstrlen)
1098 attribute_hidden;
a42195db 1099
48896b9d 1100/* Look up NAME in ld.so.cache and return the file name stored there,
ccdb048d 1101 or null if none is found. Caller must free returned string. */
17e00cc6 1102extern char *_dl_load_cache_lookup (const char *name) attribute_hidden;
48896b9d
AJ
1103
1104/* If the system does not support MAP_COPY we cannot leave the file open
1105 all the time since this would create problems when the file is replaced.
1106 Therefore we provide this function to close the file and open it again
1107 once needed. */
154d10bd 1108extern void _dl_unload_cache (void) attribute_hidden;
48896b9d 1109
40b07f5b
UD
1110/* System-dependent function to read a file's whole contents in the
1111 most convenient manner available. *SIZEP gets the size of the
1112 file. On error MAP_FAILED is returned. */
48896b9d 1113extern void *_dl_sysdep_read_whole_file (const char *file, size_t *sizep,
17e00cc6 1114 int prot) attribute_hidden;
48896b9d
AJ
1115
1116/* System-specific function to do initial startup for the dynamic linker.
1117 After this, file access calls and getenv must work. This is responsible
1118 for setting __libc_enable_secure if we need to be secure (e.g. setuid),
1119 and for setting _dl_argc and _dl_argv, and then calling _dl_main. */
1120extern ElfW(Addr) _dl_sysdep_start (void **start_argptr,
1121 void (*dl_main) (const ElfW(Phdr) *phdr,
1122 ElfW(Word) phnum,
3a56ea26
AK
1123 ElfW(Addr) *user_entry,
1124 ElfW(auxv_t) *auxv))
6ce3881d 1125 attribute_hidden;
48896b9d 1126
17e00cc6 1127extern void _dl_sysdep_start_cleanup (void) attribute_hidden;
48896b9d
AJ
1128
1129
3fb55878 1130/* Determine next available module ID. */
17e00cc6 1131extern size_t _dl_next_tls_modid (void) attribute_hidden;
3fb55878 1132
d0503676 1133/* Count the modules with TLS segments. */
17e00cc6 1134extern size_t _dl_count_modids (void) attribute_hidden;
d0503676 1135
3fb55878 1136/* Calculate offset of the TLS blocks in the static TLS block. */
17e00cc6 1137extern void _dl_determine_tlsoffset (void) attribute_hidden;
68dc80ca 1138
17796419
SN
1139/* Calculate the size of the static TLS surplus, when the given
1140 number of audit modules are loaded. */
1141void _dl_tls_static_surplus_init (size_t naudit) attribute_hidden;
0c7b002f 1142
003a27e8
NA
1143#ifndef SHARED
1144/* Set up the TCB for statically linked applications. This is called
1145 early during startup because we always use TLS (for errno and the
1146 stack protector, among other things). */
1147void __libc_setup_tls (void);
1148
9d7a3741
L
1149# if ENABLE_STATIC_PIE
1150/* Relocate static executable with PIE. */
1151extern void _dl_relocate_static_pie (void) attribute_hidden;
1152
1153/* Get a pointer to _dl_main_map. */
1154extern struct link_map * _dl_get_dl_main_map (void)
1155 __attribute__ ((visibility ("hidden")));
1156# else
1157# define _dl_relocate_static_pie()
1158# endif
978a6803 1159#endif
9d7a3741 1160
003a27e8
NA
1161/* Initialization of libpthread for statically linked applications.
1162 If libpthread is not linked in, this is an empty function. */
1163void __pthread_initialize_minimal (void) weak_function;
003a27e8 1164
9a1eb38e 1165/* Allocate memory for static TLS block (unless MEM is nonzero) and dtv. */
3012cfb0 1166extern void *_dl_allocate_tls (void *mem);
733f25e6 1167rtld_hidden_proto (_dl_allocate_tls)
9a1eb38e
UD
1168
1169/* Get size and alignment requirements of the static TLS block. */
17e00cc6 1170extern void _dl_get_tls_static_info (size_t *sizep, size_t *alignp);
a816b435 1171
17e00cc6 1172extern void _dl_allocate_static_tls (struct link_map *map) attribute_hidden;
545dbc93 1173
a816b435
RM
1174/* These are internal entry points to the two halves of _dl_allocate_tls,
1175 only used within rtld.c itself at startup time. */
17e00cc6 1176extern void *_dl_allocate_tls_storage (void) attribute_hidden;
3012cfb0 1177extern void *_dl_allocate_tls_init (void *);
68dc80ca 1178rtld_hidden_proto (_dl_allocate_tls_init)
e4138261
UD
1179
1180/* Deallocate memory allocated with _dl_allocate_tls. */
3012cfb0 1181extern void _dl_deallocate_tls (void *tcb, bool dealloc_tcb);
733f25e6 1182rtld_hidden_proto (_dl_deallocate_tls)
3fb55878 1183
adc12574 1184extern void _dl_nothread_init_static_tls (struct link_map *) attribute_hidden;
adc12574 1185
154d10bd
UD
1186/* Find origin of the executable. */
1187extern const char *_dl_get_origin (void) attribute_hidden;
1188
1189/* Count DSTs. */
2bd86632 1190extern size_t _dl_dst_count (const char *name) attribute_hidden;
154d10bd
UD
1191
1192/* Substitute DST values. */
1193extern char *_dl_dst_substitute (struct link_map *l, const char *name,
2bd86632 1194 char *result) attribute_hidden;
154d10bd 1195
9dcafc55
UD
1196/* Open the shared object NAME, relocate it, and run its initializer if it
1197 hasn't already been run. MODE is as for `dlopen' (see <dlfcn.h>). If
1198 the object is already opened, returns its existing map. */
1199extern void *_dl_open (const char *name, int mode, const void *caller,
1200 Lmid_t nsid, int argc, char *argv[], char *env[])
1201 attribute_hidden;
1202
e4eb675d
UD
1203/* Free or queue for freeing scope OLD. If other threads might be
1204 in the middle of _dl_fixup, _dl_profile_fixup or dl*sym using the
1205 old scope, OLD can't be freed until no thread is using it. */
385b4cf4 1206extern int _dl_scope_free (void *) attribute_hidden;
e4eb675d 1207
a509eb11
FW
1208
1209/* Add module to slot information data. If DO_ADD is false, only the
1210 required memory is allocated. Must be called with GL
1211 (dl_load_lock) acquired. If the function has already been called
1212 for the link map L with !do_add, then this function will not raise
1213 an exception, otherwise it is possible that it encounters a memory
1214 allocation failure. */
1215extern void _dl_add_to_slotinfo (struct link_map *l, bool do_add)
1216 attribute_hidden;
9dcafc55
UD
1217
1218/* Update slot information data for at least the generation of the
1219 module with the given index. */
58c9ff1b
L
1220extern struct link_map *_dl_update_slotinfo (unsigned long int req_modid)
1221 attribute_hidden;
9dcafc55 1222
d78efd9f
RM
1223/* Look up the module's TLS block as for __tls_get_addr,
1224 but never touch anything. Return null if it's not allocated yet. */
93025f93 1225extern void *_dl_tls_get_addr_soft (struct link_map *l) attribute_hidden;
d78efd9f 1226
9be09e06 1227extern int _dl_addr_inside_object (struct link_map *l, const ElfW(Addr) addr)
17e00cc6 1228 attribute_hidden;
d78efd9f 1229
73d7af4f 1230/* Show show of an object. */
58c9ff1b
L
1231extern void _dl_show_scope (struct link_map *new, int from)
1232 attribute_hidden;
73d7af4f 1233
3012cfb0 1234extern struct link_map *_dl_find_dso_for_object (const ElfW(Addr) addr);
be179c8a
SP
1235rtld_hidden_proto (_dl_find_dso_for_object)
1236
bc16e260 1237/* Initialization which is normally done by the dynamic linker. */
8bcdb7e0
L
1238extern void _dl_non_dynamic_init (void)
1239 attribute_hidden;
bc16e260
RM
1240
1241/* Used by static binaries to check the auxiliary vector. */
8bcdb7e0
L
1242extern void _dl_aux_init (ElfW(auxv_t) *av)
1243 attribute_hidden;
bc16e260 1244
8e1472d2
FW
1245/* Return true if the ld.so copy in this namespace is actually active
1246 and working. If false, the dl_open/dlfcn hooks have to be used to
1247 call into the outer dynamic linker (which happens after static
1248 dlopen). */
1249#ifdef SHARED
1250static inline bool
1251rtld_active (void)
1252{
1253 /* The default-initialized variable does not have a non-zero
1254 dl_init_all_dirs member, so this allows us to recognize an
1255 initialized and active ld.so copy. */
1256 return GLRO(dl_init_all_dirs) != NULL;
1257}
e1d559f3
FW
1258
1259static inline struct auditstate *
1260link_map_audit_state (struct link_map *l, size_t index)
1261{
e21a7867
FW
1262 if (l == &GL (dl_rtld_map))
1263 /* The auditstate array is stored separately. */
1264 return &GL (dl_rtld_auditstate) [index];
1265 else
1266 {
1267 /* The auditstate array follows the link map in memory. */
1268 struct auditstate *base = (struct auditstate *) (l + 1);
1269 return &base[index];
1270 }
e1d559f3
FW
1271}
1272#endif /* SHARED */
bc16e260 1273
1daccf40
FW
1274#if THREAD_GSCOPE_IN_TCB
1275void __thread_gscope_wait (void) attribute_hidden;
1276# define THREAD_GSCOPE_WAIT() __thread_gscope_wait ()
1277#endif
1278
a42195db
UD
1279__END_DECLS
1280
1281#endif /* ldsodefs.h */