]> git.ipfire.org Git - thirdparty/glibc.git/blame - sysdeps/generic/ldsodefs.h
Update.
[thirdparty/glibc.git] / sysdeps / generic / ldsodefs.h
CommitLineData
a42195db 1/* Run-time dynamic linker data structures for loaded ELF shared objects.
d1fc817e 2 Copyright (C) 1995-2002, 2003, 2004 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
AJ
15 You should have received a copy of the GNU Lesser General Public
16 License along with the GNU C Library; if not, write to the Free
17 Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
18 02111-1307 USA. */
a42195db
UD
19
20#ifndef _LDSODEFS_H
21#define _LDSODEFS_H 1
22
23#include <features.h>
24
3fb55878 25#include <stdbool.h>
a42195db
UD
26#define __need_size_t
27#define __need_NULL
28#include <stddef.h>
ef52edfc 29#include <string.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>
c12aa801 38#include <bits/libc-lock.h>
5688da55 39#include <hp-timing.h>
535b764d 40#include <tls.h>
a42195db
UD
41
42__BEGIN_DECLS
43
44/* We use this macro to refer to ELF types independent of the native wordsize.
45 `ElfW(TYPE)' is used in place of `Elf32_TYPE' or `Elf64_TYPE'. */
46#define ELFW(type) _ElfW (ELF, __ELF_NATIVE_CLASS, type)
47
48/* All references to the value of l_info[DT_PLTGOT],
49 l_info[DT_STRTAB], l_info[DT_SYMTAB], l_info[DT_RELA],
88fdf42f 50 l_info[DT_REL], l_info[DT_JMPREL], and l_info[VERSYMIDX (DT_VERSYM)]
42ba2c11 51 have to be accessed via the D_PTR macro. The macro is needed since for
88fdf42f
AJ
52 most architectures the entry is already relocated - but for some not
53 and we need to relocate at access time. */
a42195db
UD
54#ifdef DL_RO_DYN_SECTION
55# define D_PTR(map,i) (map->i->d_un.d_ptr + map->l_addr)
56#else
57# define D_PTR(map,i) map->i->d_un.d_ptr
58#endif
59
c0282c06
UD
60/* On some platforms more information than just the address of the symbol
61 is needed from the lookup functions. In this case we return the whole
62 link map. */
63#ifdef DL_LOOKUP_RETURNS_MAP
64typedef struct link_map *lookup_t;
65# define LOOKUP_VALUE(map) map
66# define LOOKUP_VALUE_ADDRESS(map) (map ? map->l_addr : 0)
67#else
68typedef ElfW(Addr) lookup_t;
69# define LOOKUP_VALUE(map) map->l_addr
70# define LOOKUP_VALUE_ADDRESS(address) address
71#endif
72
73/* on some architectures a pointer to a function is not just a pointer
74 to the actual code of the function but rather an architecture
75 specific descriptor. */
76#ifndef ELF_FUNCTION_PTR_IS_SPECIAL
09bf6406 77# define DL_SYMBOL_ADDRESS(map, ref) \
c0282c06 78 (void *) (LOOKUP_VALUE_ADDRESS (map) + ref->st_value)
09bf6406 79# define DL_LOOKUP_ADDRESS(addr) ((ElfW(Addr)) (addr))
40306912
UD
80# define DL_DT_INIT_ADDRESS(map, start) (start)
81# define DL_DT_FINI_ADDRESS(map, start) (start)
09bf6406
UD
82#endif
83
84/* Unmap a loaded object, called by _dl_close (). */
85#ifndef DL_UNMAP_IS_SPECIAL
86# define DL_UNMAP(map) \
87 __munmap ((void *) (map)->l_map_start, \
88 (map)->l_map_end - (map)->l_map_start)
c0282c06
UD
89#endif
90
beb5387c
UD
91/* By default we do not need special support to initialize DSOs loaded
92 by statically linked binaries. */
93#ifndef DL_STATIC_INIT
94# define DL_STATIC_INIT(map)
95#endif
96
cf5a372e
UD
97/* Reloc type classes as returned by elf_machine_type_class().
98 ELF_RTYPE_CLASS_PLT means this reloc should not be satisfied by
99 some PLT symbol, ELF_RTYPE_CLASS_COPY means this reloc should not be
18ef464b
UD
100 satisfied by any symbol in the executable. Some architectures do
101 not support copy relocations. In this case we define the macro to
102 zero so that the code for handling them gets automatically optimized
103 out. */
cf5a372e 104#define ELF_RTYPE_CLASS_PLT 1
18ef464b
UD
105#ifndef DL_NO_COPY_RELOCS
106# define ELF_RTYPE_CLASS_COPY 2
107#else
108# define ELF_RTYPE_CLASS_COPY 0
109#endif
cf5a372e 110
9d63abbc
UD
111/* ELF uses the PF_x macros to specify the segment permissions, mmap
112 uses PROT_xxx. In most cases the three macros have the values 1, 2,
113 and 3 but not in a matching order. The following macros allows
114 converting from the PF_x values to PROT_xxx values. */
115#define PF_TO_PROT \
116 ((PROT_READ << (PF_R * 4)) \
117 | (PROT_WRITE << (PF_W * 4)) \
118 | (PROT_EXEC << (PF_X * 4)) \
119 | ((PROT_READ | PROT_WRITE) << ((PF_R | PF_W) * 4)) \
120 | ((PROT_READ | PROT_EXEC) << ((PF_R | PF_X) * 4)) \
121 | ((PROT_WRITE | PROT_EXEC) << (PF_W | PF_X) * 4) \
122 | ((PROT_READ | PROT_WRITE | PROT_EXEC) << ((PF_R | PF_W | PF_X) * 4)))
123
124
a42195db
UD
125/* For the version handling we need an array with only names and their
126 hash values. */
127struct r_found_version
128 {
129 const char *name;
130 ElfW(Word) hash;
131
132 int hidden;
133 const char *filename;
134 };
135
136/* We want to cache information about the searches for shared objects. */
137
138enum r_dir_status { unknown, nonexisting, existing };
139
140struct r_search_path_elem
141 {
142 /* This link is only used in the `all_dirs' member of `r_search_path'. */
143 struct r_search_path_elem *next;
144
145 /* Strings saying where the definition came from. */
146 const char *what;
147 const char *where;
148
149 /* Basename for this search path element. The string must end with
150 a slash character. */
151 const char *dirname;
152 size_t dirnamelen;
153
154 enum r_dir_status status[0];
155 };
156
157struct r_strlenpair
158 {
159 const char *str;
160 size_t len;
161 };
162
163
164/* A data structure for a simple single linked list of strings. */
165struct libname_list
166 {
167 const char *name; /* Name requested (before search). */
168 struct libname_list *next; /* Link to next name for this object. */
752a2a50
UD
169 int dont_free; /* Flag whether this element should be freed
170 if the object is not entirely unloaded. */
a42195db
UD
171 };
172
173
eec8b6ca
UD
174/* Bit masks for the objects which valid callers can come from to
175 functions with restricted interface. */
176enum allowmask
177 {
178 allow_libc = 1,
179 allow_libdl = 2,
180 allow_libpthread = 4,
181 allow_ldso = 8
182 };
183
184
a42195db 185/* Test whether given NAME matches any of the names of the given object. */
dd272e57
UD
186extern int _dl_name_match_p (const char *__name, struct link_map *__map)
187 internal_function;
a42195db
UD
188
189/* Function used as argument for `_dl_receive_error' function. The
190 arguments are the error code, error string, and the objname the
191 error occurred in. */
192typedef void (*receiver_fct) (int, const char *, const char *);
193\f
194/* Internal functions of the run-time dynamic linker.
195 These can be accessed if you link again the dynamic linker
196 as a shared library, as in `-lld' or `/lib/ld.so' explicitly;
197 but are not normally of interest to user programs.
198
199 The `-ldl' library functions in <dlfcn.h> provide a simple
200 user interface to run-time dynamic linking. */
201
202
d6b5d570
UD
203#ifndef SHARED
204# define EXTERN extern
205# define GL(name) _##name
206#else
207# define EXTERN
403e0597 208# ifdef IS_IN_rtld
0d01dace
UD
209# define GL(name) _rtld_local._##name
210# else
211# define GL(name) _rtld_global._##name
212# endif
d6b5d570
UD
213struct rtld_global
214{
215#endif
216 /* Don't change the order of the following elements. 'dl_loaded'
217 must remain the first element. Forever. */
218
219 /* And a pointer to the map for the main map. */
220 EXTERN struct link_map *_dl_loaded;
221 /* Number of object in the _dl_loaded list. */
222 EXTERN unsigned int _dl_nloaded;
223 /* Array representing global scope. */
224 EXTERN struct r_scope_elem *_dl_global_scope[2];
225 /* Direct pointer to the searchlist of the main object. */
226 EXTERN struct r_scope_elem *_dl_main_searchlist;
d6b5d570
UD
227 /* This is zero at program start to signal that the global scope map is
228 allocated by rtld. Later it keeps the size of the map. It might be
229 reset if in _dl_close if the last global object is removed. */
230 EXTERN size_t _dl_global_scope_alloc;
231
5688da55
UD
232 /* During the program run we must not modify the global data of
233 loaded shared object simultanously in two threads. Therefore we
234 protect `_dl_open' and `_dl_close' in dl-close.c.
235
236 This must be a recursive lock since the initializer function of
237 the loaded object might as well require a call to this function.
238 At this time it is not anymore a problem to modify the tables. */
d3c9f895 239 __rtld_lock_define_recursive (EXTERN, _dl_load_lock)
5688da55 240
bed12f78
UD
241 /* Incremented whenever something may have been added to dl_loaded. */
242 EXTERN unsigned long long _dl_load_adds;
bed12f78 243
d6b5d570
UD
244#ifndef MAP_ANON
245 /* File descriptor referring to the zero-fill device. */
246 EXTERN int _dl_zerofd;
247#endif
a42195db 248
d6b5d570
UD
249 /* The object to be initialized first. */
250 EXTERN struct link_map *_dl_initfirst;
251
67eb7235 252#if HP_TIMING_AVAIL || HP_SMALL_TIMING_AVAIL
ccdf0cab 253 /* Start time on CPU clock. */
5688da55
UD
254 EXTERN hp_timing_t _dl_cpuclock_offset;
255#endif
256
d6b5d570
UD
257 /* Map of shared object to be profiled. */
258 EXTERN struct link_map *_dl_profile_map;
d6b5d570
UD
259
260 /* Counters for the number of relocations performed. */
261 EXTERN unsigned long int _dl_num_relocations;
262 EXTERN unsigned long int _dl_num_cache_relocations;
263
d6b5d570
UD
264 /* List of search directories. */
265 EXTERN struct r_search_path_elem *_dl_all_dirs;
d6b5d570 266
68dc80ca
RM
267#ifdef _LIBC_REENTRANT
268 EXTERN void **(*_dl_error_catch_tsd) (void) __attribute__ ((const));
269#endif
270
d6b5d570
UD
271 /* Structure describing the dynamic linker itself. */
272 EXTERN struct link_map _dl_rtld_map;
ce460d04 273
334fcf2a
UD
274#if defined SHARED && defined _LIBC_REENTRANT \
275 && defined __rtld_lock_default_lock_recursive
276 EXTERN void (*_dl_rtld_lock_recursive) (void *);
277 EXTERN void (*_dl_rtld_unlock_recursive) (void *);
278#endif
279
ecdeaac0
RM
280 /* Prevailing state of the stack, PF_X indicating it's executable. */
281 EXTERN ElfW(Word) _dl_stack_flags;
282
283 /* If loading a shared object requires that we make the stack executable
284 when it was not, we do it by calling this function.
285 It returns an errno code or zero on success. */
d1fc817e 286 EXTERN int (*_dl_make_stack_executable_hook) (void **) internal_function;
ecdeaac0 287
68dc80ca
RM
288 /* Keep the conditional TLS members at the end so the layout of the
289 structure used by !USE_TLS code matches the prefix of the layout in
290 the USE_TLS rtld. Note that `struct link_map' is conditionally
291 defined as well, so _dl_rtld_map needs to be last before this. */
292#ifdef USE_TLS
293 /* Highest dtv index currently needed. */
294 EXTERN size_t _dl_tls_max_dtv_idx;
295 /* Flag signalling whether there are gaps in the module ID allocation. */
296 EXTERN bool _dl_tls_dtv_gaps;
297 /* Information about the dtv slots. */
298 EXTERN struct dtv_slotinfo_list
299 {
300 size_t len;
301 struct dtv_slotinfo_list *next;
302 struct dtv_slotinfo
303 {
304 size_t gen;
305 struct link_map *map;
306 } slotinfo[0];
307 } *_dl_tls_dtv_slotinfo_list;
308 /* Number of modules in the static TLS block. */
309 EXTERN size_t _dl_tls_static_nelem;
310 /* Size of the static TLS block. */
311 EXTERN size_t _dl_tls_static_size;
312 /* Size actually allocated in the static TLS block. */
313 EXTERN size_t _dl_tls_static_used;
314 /* Alignment requirement of the static TLS block. */
315 EXTERN size_t _dl_tls_static_align;
316
317/* Number of additional entries in the slotinfo array of each slotinfo
318 list element. A large number makes it almost certain take we never
319 have to iterate beyond the first element in the slotinfo list. */
320# define TLS_SLOTINFO_SURPLUS (62)
321
322/* Number of additional slots in the dtv allocated. */
323# define DTV_SURPLUS (14)
324
325 /* Initial dtv of the main thread, not allocated with normal malloc. */
326 EXTERN void *_dl_initial_dtv;
327 /* Generation counter for the dtv. */
328 EXTERN size_t _dl_tls_generation;
adc12574
UD
329
330 EXTERN void (*_dl_init_static_tls) (struct link_map *);
ce460d04 331#endif
68dc80ca 332
d6b5d570
UD
333#ifdef SHARED
334};
5fe14d96 335# define __rtld_global_attribute__
403e0597 336# ifdef IS_IN_rtld
0d01dace
UD
337# ifdef HAVE_VISIBILITY_ATTRIBUTE
338# ifdef HAVE_SDATA_SECTION
339# define __rtld_local_attribute__ \
340 __attribute__ ((visibility ("hidden"), section (".sdata")))
5fe14d96
UD
341# undef __rtld_global_attribute__
342# define __rtld_global_attribute__ __attribute__ ((section (".sdata")))
0d01dace
UD
343# else
344# define __rtld_local_attribute__ __attribute__ ((visibility ("hidden")))
345# endif
346# else
347# define __rtld_local_attribute__
348# endif
349extern struct rtld_global _rtld_local __rtld_local_attribute__;
021723ab 350# undef __rtld_local_attribute__
0d01dace 351# endif
5fe14d96 352extern struct rtld_global _rtld_global __rtld_global_attribute__;
021723ab 353# undef __rtld_global_attribute__
d6b5d570 354#endif
20c37dfd
UD
355
356#ifndef SHARED
357# define GLRO(name) _##name
358#else
359# ifdef IS_IN_rtld
360# define GLRO(name) _rtld_local_ro._##name
361# else
362# define GLRO(name) _rtld_global_ro._##name
363# endif
364struct rtld_global_ro
365{
366#endif
367
368 /* If nonzero the appropriate debug information is printed. */
369 EXTERN int _dl_debug_mask;
370#define DL_DEBUG_LIBS (1 << 0)
371#define DL_DEBUG_IMPCALLS (1 << 1)
372#define DL_DEBUG_BINDINGS (1 << 2)
373#define DL_DEBUG_SYMBOLS (1 << 3)
374#define DL_DEBUG_VERSIONS (1 << 4)
375#define DL_DEBUG_RELOC (1 << 5)
376#define DL_DEBUG_FILES (1 << 6)
377#define DL_DEBUG_STATISTICS (1 << 7)
7a11603d 378#define DL_DEBUG_UNUSED (1 << 8)
20c37dfd 379/* These two are used only internally. */
7a11603d
UD
380#define DL_DEBUG_HELP (1 << 9)
381#define DL_DEBUG_PRELINK (1 << 10)
20c37dfd
UD
382
383 /* Cached value of `getpagesize ()'. */
384 EXTERN size_t _dl_pagesize;
385
386 /* OS version. */
387 EXTERN unsigned int _dl_osversion;
388 /* Platform name. */
389 EXTERN const char *_dl_platform;
390 EXTERN size_t _dl_platformlen;
391
c31e278f
UD
392 /* Copy of the content of `_dl_main_searchlist' at startup time. */
393 EXTERN struct r_scope_elem _dl_initial_searchlist;
394
20c37dfd
UD
395 /* CLK_TCK as reported by the kernel. */
396 EXTERN int _dl_clktck;
397
398 /* If nonzero print warnings messages. */
399 EXTERN int _dl_verbose;
400
dd70526e
UD
401 /* File descriptor to write debug messages to. */
402 EXTERN int _dl_debug_fd;
403
20c37dfd
UD
404 /* Do we do lazy relocations? */
405 EXTERN int _dl_lazy;
406
407 /* Nonzero if runtime lookups should not update the .got/.plt. */
408 EXTERN int _dl_bind_not;
409
410 /* Nonzero if references should be treated as weak during runtime
411 linking. */
412 EXTERN int _dl_dynamic_weak;
413
414 /* Default floating-point control word. */
415 EXTERN fpu_control_t _dl_fpu_control;
416
417 /* Expected cache ID. */
418 EXTERN int _dl_correct_cache_id;
419
420 /* Mask for hardware capabilities that are available. */
421 EXTERN unsigned long int _dl_hwcap;
422
423 /* Mask for important hardware capabilities we honour. */
424 EXTERN unsigned long int _dl_hwcap_mask;
425
c31e278f
UD
426 /* Get architecture specific definitions. */
427#define PROCINFO_DECL
ee600e3f
UD
428#ifndef PROCINFO_CLASS
429# define PROCINFO_CLASS EXTERN
430#endif
c31e278f
UD
431#include <dl-procinfo.c>
432
20c37dfd
UD
433 /* Names of shared object for which the RPATH should be ignored. */
434 EXTERN const char *_dl_inhibit_rpath;
435
436 /* Location of the binary. */
437 EXTERN const char *_dl_origin_path;
438
439 /* -1 if the dynamic linker should honor library load bias,
440 0 if not, -2 use the default (honor biases for normal
441 binaries, don't honor for PIEs). */
442 EXTERN ElfW(Addr) _dl_use_load_bias;
443
444 /* Name of the shared object to be profiled (if any). */
445 EXTERN const char *_dl_profile;
446 /* Filename of the output file. */
447 EXTERN const char *_dl_profile_output;
448 /* Name of the object we want to trace the prelinking. */
449 EXTERN const char *_dl_trace_prelink;
450 /* Map of shared object to be prelink traced. */
451 EXTERN struct link_map *_dl_trace_prelink_map;
c31e278f
UD
452
453 /* All search directories defined at startup. */
454 EXTERN struct r_search_path_elem *_dl_init_all_dirs;
455
456#if HP_TIMING_AVAIL || HP_SMALL_TIMING_AVAIL
457 /* Overhead of a high-precision timing measurement. */
458 EXTERN hp_timing_t _dl_hp_timing_overhead;
459#endif
20c37dfd
UD
460
461#ifdef NEED_DL_SYSINFO
462 /* Syscall handling improvements. This is very specific to x86. */
463 EXTERN uintptr_t _dl_sysinfo;
464
465 /* The vsyscall page is a virtual DSO pre-mapped by the kernel.
466 This points to its ELF header. */
467 EXTERN const ElfW(Ehdr) *_dl_sysinfo_dso;
468#endif
469
470#ifdef SHARED
154d10bd
UD
471 /* We add a function table to _rtld_global which is then used to
472 call the function instead of going through the PLT. The result
473 is that we can avoid exporting the functions and we do not jump
474 PLT relocations in libc.so. */
475 const char *(*_dl_get_origin) (void);
476 size_t (*_dl_dst_count) (const char *, int);
477 char *(*_dl_dst_substitute) (struct link_map *, const char *, char *, int);
478 struct link_map *(internal_function *_dl_map_object) (struct link_map *,
479 const char *, int,
480 int, int, int);
481 void (internal_function *_dl_map_object_deps) (struct link_map *,
482 struct link_map **,
483 unsigned int, int, int);
484 void (*_dl_relocate_object) (struct link_map *, struct r_scope_elem *[],
485 int, int);
486 int (internal_function *_dl_check_map_versions) (struct link_map *, int,
487 int);
488 void (internal_function *_dl_init) (struct link_map *, int, char **,
489 char **);
490 void (*_dl_debug_state) (void);
491#ifndef MAP_COPY
492 void (*_dl_unload_cache) (void);
493#endif
494 void (*_dl_debug_printf) (const char *, ...)
495 __attribute__ ((__format__ (__printf__, 1, 2)));
496 int (internal_function *_dl_catch_error) (const char **, const char **,
497 void (*) (void *), void *);
498 void (internal_function *_dl_signal_error) (int, const char *, const char *,
499 const char *);
53bfdc1c 500 void (internal_function *_dl_start_profile) (void);
154d10bd 501 void (*_dl_mcount) (ElfW(Addr) frompc, ElfW(Addr) selfpc);
021723ab
UD
502 lookup_t (internal_function *_dl_lookup_symbol_x) (const char *,
503 struct link_map *,
504 const ElfW(Sym) **,
505 struct r_scope_elem *[],
506 const struct r_found_version *,
507 int, int,
508 struct link_map *);
eec8b6ca 509 int (*_dl_check_caller) (const void *, enum allowmask);
154d10bd 510
20c37dfd
UD
511};
512# define __rtld_global_attribute__
513# ifdef IS_IN_rtld
021723ab
UD
514# ifdef HAVE_VISIBILITY_ATTRIBUTE
515# define __rtld_local_attribute__ __attribute__ ((visibility ("hidden")))
516# else
517# define __rtld_local_attribute__
518# endif
20c37dfd
UD
519extern struct rtld_global_ro _rtld_local_ro
520 attribute_relro __rtld_local_attribute__;
20c37dfd
UD
521extern struct rtld_global_ro _rtld_global_ro
522 attribute_relro __rtld_global_attribute__;
021723ab 523# undef __rtld_local_attribute__
154d10bd
UD
524# else
525/* We cheat a bit here. We declare the variable as as const even
526 though it is at startup. */
527extern const struct rtld_global_ro _rtld_global_ro
528 attribute_relro __rtld_global_attribute__;
529# endif
021723ab 530# undef __rtld_global_attribute__
20c37dfd 531#endif
d6b5d570
UD
532#undef EXTERN
533
68dc80ca
RM
534#ifdef IS_IN_rtld
535/* This is the initial value of GL(dl_error_catch_tsd).
536 A non-TLS libpthread will change it. */
537extern void **_dl_initial_error_catch_tsd (void) __attribute__ ((const))
538 attribute_hidden;
539#endif
540
ecdeaac0
RM
541/* This is the initial value of GL(dl_make_stack_executable_hook).
542 A threads library can change it. */
d1fc817e 543extern int _dl_make_stack_executable (void **stack_endp) internal_function;
ecdeaac0
RM
544rtld_hidden_proto (_dl_make_stack_executable)
545
ea4f25a7
UD
546/* Variable pointing to the end of the stack (or close to it). This value
547 must be constant over the runtime of the application. Some programs
548 might use the variable which results in copy relocations on some
549 platforms. But this does not matter, ld.so can always use the local
550 copy. */
392a6b52 551extern void *__libc_stack_end attribute_relro;
ea4f25a7
UD
552rtld_hidden_proto (__libc_stack_end)
553
d6b5d570 554/* Parameters passed to the dynamic linker. */
392a6b52 555extern int _dl_argc attribute_hidden attribute_relro;
33ab3b66
UD
556extern char **_dl_argv
557#ifndef DL_ARGV_NOT_RELRO
558 attribute_relro
559#endif
560 ;
403e0597 561#ifdef IS_IN_rtld
33ab3b66
UD
562extern char **_dl_argv_internal attribute_hidden
563# ifndef DL_ARGV_NOT_RELRO
564 attribute_relro
565# endif
566 ;
e6caf4e1
UD
567# define rtld_progname (INTUSE(_dl_argv)[0])
568#else
569# define rtld_progname _dl_argv[0]
570#endif
d6b5d570 571
ca3c0135
UD
572/* The array with message we print as a last resort. */
573extern const char _dl_out_of_memory[];
403e0597 574#ifdef IS_IN_rtld
e6caf4e1
UD
575/* XXX #ifdef should go away. */
576extern const char _dl_out_of_memory_internal[] attribute_hidden;
577#endif
ca3c0135 578
5bbcba0d
RM
579/* Flag set at startup and cleared when the last initializer has run. */
580extern int _dl_starting_up;
581weak_extern (_dl_starting_up)
b5b9cfc4 582#ifdef IS_IN_rtld
5bbcba0d
RM
583extern int _dl_starting_up_internal attribute_hidden;
584#endif
f55727ca 585
a42195db
UD
586/* OS-dependent function to open the zero-fill device. */
587extern int _dl_sysdep_open_zero_fill (void); /* dl-sysdep.c */
588
b5ba0659
UD
589
590/* Write message on the debug file descriptor. The parameters are
591 interpreted as for a `printf' call. All the lines start with a
592 tag showing the PID. */
593extern void _dl_debug_printf (const char *fmt, ...)
154d10bd 594 __attribute__ ((__format__ (__printf__, 1, 2))) attribute_hidden;
b5ba0659
UD
595
596/* Write message on the debug file descriptor. The parameters are
597 interpreted as for a `printf' call. All the lines buf the first
598 start with a tag showing the PID. */
599extern void _dl_debug_printf_c (const char *fmt, ...)
600 __attribute__ ((__format__ (__printf__, 1, 2)));
601
602
603/* Write a message on the specified descriptor FD. The parameters are
604 interpreted as for a `printf' call. */
605extern void _dl_dprintf (int fd, const char *fmt, ...)
6ce3881d
RM
606 __attribute__ ((__format__ (__printf__, 2, 3)))
607 attribute_hidden;
b5ba0659
UD
608
609/* Write a message on the specified descriptor standard output. The
610 parameters are interpreted as for a `printf' call. */
611#define _dl_printf(fmt, args...) \
612 _dl_dprintf (STDOUT_FILENO, fmt, ##args)
613
614/* Write a message on the specified descriptor standard error. The
615 parameters are interpreted as for a `printf' call. */
616#define _dl_error_printf(fmt, args...) \
617 _dl_dprintf (STDERR_FILENO, fmt, ##args)
618
619/* Write a message on the specified descriptor standard error and exit
620 the program. The parameters are interpreted as for a `printf' call. */
621#define _dl_fatal_printf(fmt, args...) \
a42195db
UD
622 do \
623 { \
b5ba0659 624 _dl_dprintf (STDERR_FILENO, fmt, ##args); \
a42195db
UD
625 _exit (127); \
626 } \
627 while (1)
628
a42195db
UD
629
630/* This function is called by all the internal dynamic linker functions
631 when they encounter an error. ERRCODE is either an `errno' code or
632 zero; OBJECT is the name of the problematical shared object, or null if
633 it is a general problem; ERRSTRING is a string describing the specific
634 problem. */
8e17ea58 635extern void _dl_signal_error (int errcode, const char *object,
407fe3bb 636 const char *occurred, const char *errstring)
6ce3881d 637 internal_function __attribute__ ((__noreturn__)) attribute_hidden;
a42195db
UD
638
639/* Like _dl_signal_error, but may return when called in the context of
640 _dl_receive_error. */
407fe3bb
UD
641extern void _dl_signal_cerror (int errcode, const char *object,
642 const char *occation, const char *errstring)
a42195db
UD
643 internal_function;
644
645/* Call OPERATE, receiving errors from `dl_signal_cerror'. Unlike
646 `_dl_catch_error' the operation is resumed after the OPERATE
647 function returns.
648 ARGS is passed as argument to OPERATE. */
649extern void _dl_receive_error (receiver_fct fct, void (*operate) (void *),
650 void *args)
651 internal_function;
652
653
654/* Open the shared object NAME and map in its segments.
655 LOADER's DT_RPATH is used in searching for NAME.
656 If the object is already opened, returns its existing map.
657 For preloaded shared objects PRELOADED is set to a non-zero
658 value to allow additional security checks. */
659extern struct link_map *_dl_map_object (struct link_map *loader,
660 const char *name, int preloaded,
2f54c82d 661 int type, int trace_mode, int mode)
6ce3881d 662 internal_function attribute_hidden;
a42195db
UD
663
664/* Call _dl_map_object on the dependencies of MAP, and set up
665 MAP->l_searchlist. PRELOADS points to a vector of NPRELOADS previously
666 loaded objects that will be inserted into MAP->l_searchlist after MAP
667 but before its dependencies. */
668extern void _dl_map_object_deps (struct link_map *map,
669 struct link_map **preloads,
87837aac
UD
670 unsigned int npreloads, int trace_mode,
671 int open_mode)
6ce3881d 672 internal_function attribute_hidden;
a42195db
UD
673
674/* Cache the locations of MAP's hash table. */
6ce3881d
RM
675extern void _dl_setup_hash (struct link_map *map)
676 internal_function attribute_hidden;
a42195db
UD
677
678
45e4762c
RM
679/* Collect the directories in the search path for LOADER's dependencies.
680 The data structure is defined in <dlfcn.h>. If COUNTING is true,
681 SI->dls_cnt and SI->dls_size are set; if false, those must be as set
682 by a previous call with COUNTING set, and SI must point to SI->dls_size
683 bytes to be used in filling in the result. */
684extern void _dl_rtld_di_serinfo (struct link_map *loader,
685 Dl_serinfo *si, bool counting)
686 internal_function;
687
688
a42195db
UD
689/* Search loaded objects' symbol tables for a definition of the symbol
690 referred to by UNDEF. *SYM is the symbol table entry containing the
691 reference; it is replaced with the defining symbol, and the base load
692 address of the defining object is returned. SYMBOL_SCOPE is a
693 null-terminated list of object scopes to search; each object's
694 l_searchlist (i.e. the segment of the dependency tree starting at that
695 object) is searched in turn. REFERENCE_NAME should name the object
696 containing the reference; it is used in error messages.
cf5a372e 697 TYPE_CLASS describes the type of symbol we are looking for. */
f9f2a150
UD
698enum
699 {
700 /* If necessary add dependency between user and provider object. */
701 DL_LOOKUP_ADD_DEPENDENCY = 1,
702 /* Return most recent version instead of default version for
703 unversioned lookup. */
704 DL_LOOKUP_RETURN_NEWEST = 2
705 };
706
a42195db 707/* Lookup versioned symbol. */
021723ab
UD
708extern lookup_t _dl_lookup_symbol_x (const char *undef,
709 struct link_map *undef_map,
710 const ElfW(Sym) **sym,
711 struct r_scope_elem *symbol_scope[],
712 const struct r_found_version *version,
713 int type_class, int explicit,
714 struct link_map *skip_map)
6ce3881d 715 internal_function attribute_hidden;
a42195db 716
a42195db
UD
717
718/* Look up symbol NAME in MAP's scope and return its run-time address. */
719extern ElfW(Addr) _dl_symbol_value (struct link_map *map, const char *name)
720 internal_function;
721
a42195db
UD
722/* Allocate a `struct link_map' for a new object being loaded,
723 and enter it into the _dl_main_map list. */
724extern struct link_map *_dl_new_object (char *realname, const char *libname,
1fc07491
UD
725 int type, struct link_map *loader,
726 int mode)
6ce3881d 727 internal_function attribute_hidden;
a42195db
UD
728
729/* Relocate the given object (if it hasn't already been).
730 SCOPE is passed to _dl_lookup_symbol in symbol lookups.
731 If LAZY is nonzero, don't relocate its PLT. */
732extern void _dl_relocate_object (struct link_map *map,
733 struct r_scope_elem *scope[],
154d10bd 734 int lazy, int consider_profiling)
6ce3881d 735 attribute_hidden;
a42195db 736
e8648a5a
UD
737/* Protect PT_GNU_RELRO area. */
738extern void _dl_protect_relro (struct link_map *map)
739 internal_function attribute_hidden;
740
a42195db
UD
741/* Call _dl_signal_error with a message about an unhandled reloc type.
742 TYPE is the result of ELFW(R_TYPE) (r_info), i.e. an R_<CPU>_* value.
743 PLT is nonzero if this was a PLT reloc; it just affects the message. */
744extern void _dl_reloc_bad_type (struct link_map *map,
ea41b926
UD
745 unsigned int type, int plt)
746 internal_function __attribute__ ((__noreturn__));
a42195db 747
32e6df36
UD
748/* Resolve conflicts if prelinking. */
749extern void _dl_resolve_conflicts (struct link_map *l,
750 ElfW(Rela) *conflict,
751 ElfW(Rela) *conflictend);
752
a42195db
UD
753/* Check the version dependencies of all objects available through
754 MAP. If VERBOSE print some more diagnostics. */
145b8413
UD
755extern int _dl_check_all_versions (struct link_map *map, int verbose,
756 int trace_mode)
a42195db
UD
757 internal_function;
758
759/* Check the version dependencies for MAP. If VERBOSE print some more
760 diagnostics. */
145b8413
UD
761extern int _dl_check_map_versions (struct link_map *map, int verbose,
762 int trace_mode)
a42195db
UD
763 internal_function;
764
dacc8ffa
UD
765/* Initialize the object in SCOPE by calling the constructors with
766 ARGC, ARGV, and ENV as the parameters. */
767extern void _dl_init (struct link_map *main_map, int argc, char **argv,
154d10bd 768 char **env) internal_function attribute_hidden;
a42195db
UD
769
770/* Call the finalizer functions of all shared objects whose
771 initializer functions have completed. */
772extern void _dl_fini (void) internal_function;
773
774/* The dynamic linker calls this function before and having changing
775 any shared object mappings. The `r_state' member of `struct r_debug'
776 says what change is taking place. This function's address is
777 the value of the `r_brk' member. */
154d10bd 778extern void _dl_debug_state (void) attribute_hidden;
a42195db
UD
779
780/* Initialize `struct r_debug' if it has not already been done. The
781 argument is the run-time load address of the dynamic linker, to be put
782 in the `r_ldbase' member. Returns the address of the structure. */
783extern struct r_debug *_dl_debug_initialize (ElfW(Addr) ldbase)
784 internal_function;
785
786/* Initialize the basic data structure for the search paths. */
787extern void _dl_init_paths (const char *library_path) internal_function;
788
789/* Gather the information needed to install the profiling tables and start
790 the timers. */
53bfdc1c 791extern void _dl_start_profile (void) internal_function attribute_hidden;
a42195db
UD
792
793/* The actual functions used to keep book on the calls. */
794extern void _dl_mcount (ElfW(Addr) frompc, ElfW(Addr) selfpc);
9360906d
UD
795extern void _dl_mcount_internal (ElfW(Addr) frompc, ElfW(Addr) selfpc)
796 attribute_hidden;
a42195db
UD
797
798/* This function is simply a wrapper around the _dl_mcount function
799 which does not require a FROMPC parameter since this is the
800 calling function. */
801extern void _dl_mcount_wrapper (void *selfpc);
802
803/* Show the members of the auxiliary array passed up from the kernel. */
804extern void _dl_show_auxv (void) internal_function;
805
806/* Return all environment variables starting with `LD_', one after the
807 other. */
808extern char *_dl_next_ld_env_entry (char ***position) internal_function;
809
810/* Return an array with the names of the important hardware capabilities. */
811extern const struct r_strlenpair *_dl_important_hwcaps (const char *platform,
812 size_t paltform_len,
813 size_t *sz,
814 size_t *max_capstrlen)
815 internal_function;
816
48896b9d
AJ
817/* Look up NAME in ld.so.cache and return the file name stored there,
818 or null if none is found. */
819extern const char *_dl_load_cache_lookup (const char *name)
820 internal_function;
821
822/* If the system does not support MAP_COPY we cannot leave the file open
823 all the time since this would create problems when the file is replaced.
824 Therefore we provide this function to close the file and open it again
825 once needed. */
154d10bd 826extern void _dl_unload_cache (void) attribute_hidden;
48896b9d 827
40b07f5b
UD
828/* System-dependent function to read a file's whole contents in the
829 most convenient manner available. *SIZEP gets the size of the
830 file. On error MAP_FAILED is returned. */
48896b9d
AJ
831extern void *_dl_sysdep_read_whole_file (const char *file, size_t *sizep,
832 int prot)
6ce3881d 833 internal_function attribute_hidden;
48896b9d
AJ
834
835/* System-specific function to do initial startup for the dynamic linker.
836 After this, file access calls and getenv must work. This is responsible
837 for setting __libc_enable_secure if we need to be secure (e.g. setuid),
838 and for setting _dl_argc and _dl_argv, and then calling _dl_main. */
839extern ElfW(Addr) _dl_sysdep_start (void **start_argptr,
840 void (*dl_main) (const ElfW(Phdr) *phdr,
841 ElfW(Word) phnum,
6ce3881d
RM
842 ElfW(Addr) *user_entry))
843 attribute_hidden;
48896b9d
AJ
844
845extern void _dl_sysdep_start_cleanup (void)
6ce3881d 846 internal_function attribute_hidden;
48896b9d
AJ
847
848
3fb55878 849/* Determine next available module ID. */
68dc80ca 850extern size_t _dl_next_tls_modid (void) internal_function attribute_hidden;
3fb55878
UD
851
852/* Calculate offset of the TLS blocks in the static TLS block. */
68dc80ca
RM
853extern void _dl_determine_tlsoffset (void) internal_function attribute_hidden;
854
855/* Set up the data structures for TLS, when they were not set up at startup.
856 Returns nonzero on malloc failure.
857 This is called from _dl_map_object_from_fd or by libpthread. */
858extern int _dl_tls_setup (void) internal_function;
859rtld_hidden_proto (_dl_tls_setup)
3fb55878 860
9a1eb38e
UD
861/* Allocate memory for static TLS block (unless MEM is nonzero) and dtv. */
862extern void *_dl_allocate_tls (void *mem) internal_function;
733f25e6 863rtld_hidden_proto (_dl_allocate_tls)
9a1eb38e
UD
864
865/* Get size and alignment requirements of the static TLS block. */
866extern void _dl_get_tls_static_info (size_t *sizep, size_t *alignp)
867 internal_function;
a816b435 868
adc12574 869extern void _dl_allocate_static_tls (struct link_map *map)
545dbc93
RM
870 internal_function attribute_hidden;
871
a816b435
RM
872/* These are internal entry points to the two halves of _dl_allocate_tls,
873 only used within rtld.c itself at startup time. */
874extern void *_dl_allocate_tls_storage (void)
68dc80ca 875 internal_function attribute_hidden;
209a8ca3 876extern void *_dl_allocate_tls_init (void *) internal_function;
68dc80ca 877rtld_hidden_proto (_dl_allocate_tls_init)
e4138261
UD
878
879/* Deallocate memory allocated with _dl_allocate_tls. */
9a1eb38e 880extern void _dl_deallocate_tls (void *tcb, bool dealloc_tcb) internal_function;
733f25e6 881rtld_hidden_proto (_dl_deallocate_tls)
3fb55878 882
adc12574
UD
883#if defined USE_TLS
884extern void _dl_nothread_init_static_tls (struct link_map *) attribute_hidden;
885#endif
886
154d10bd
UD
887/* Find origin of the executable. */
888extern const char *_dl_get_origin (void) attribute_hidden;
889
890/* Count DSTs. */
891extern size_t _dl_dst_count (const char *name, int is_path) attribute_hidden;
892
893/* Substitute DST values. */
894extern char *_dl_dst_substitute (struct link_map *l, const char *name,
895 char *result, int is_path) attribute_hidden;
896
eec8b6ca
UD
897/* Check validity of the caller. */
898extern int _dl_check_caller (const void *caller, enum allowmask mask)
899 attribute_hidden;
900
a42195db
UD
901__END_DECLS
902
903#endif /* ldsodefs.h */