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