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