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