Add a generic scalb implementation
[glibc.git] / include / dlfcn.h
blob93dd369ab12a57457bd6ef2c51692efa0eea72c6
1 #ifndef _DLFCN_H
2 #include <dlfcn/dlfcn.h>
3 #ifndef _ISOMAC
4 #include <link.h> /* For ElfW. */
5 #include <stdbool.h>
7 /* Internally used flag. */
8 #define __RTLD_DLOPEN 0x80000000
9 #define __RTLD_SPROF 0x40000000
10 #define __RTLD_OPENEXEC 0x20000000
11 #define __RTLD_CALLMAP 0x10000000
12 #define __RTLD_AUDIT 0x08000000
13 #define __RTLD_SECURE 0x04000000 /* Apply additional security checks. */
14 #define __RTLD_NOIFUNC 0x02000000 /* Suppress calling ifunc functions. */
16 #define __LM_ID_CALLER -2
18 #ifdef SHARED
19 /* Locally stored program arguments. */
20 extern int __dlfcn_argc attribute_hidden;
21 extern char **__dlfcn_argv attribute_hidden;
22 #else
23 /* These variables are defined and initialized in the startup code. */
24 extern int __libc_argc attribute_hidden;
25 extern char **__libc_argv attribute_hidden;
27 # define __dlfcn_argc __libc_argc
28 # define __dlfcn_argv __libc_argv
29 #endif
32 /* Now define the internal interfaces. */
34 /* Use RTLD_NOW here because:
35 1. In pthread_cancel_init we want to use RTLD_NOW to reduce the stack usage
36 of future cancellation operations, particularly when the target thread
37 is running with a small stack. Likewise for consistency we do the same
38 thing in __libgcc_s_init. RTLD_NOW will rarely make a difference for
39 __libgcc_s_init because unwinding is already in progress, so libgcc_s.so
40 has already been loaded if its unwinder is used (Bug 22636).
41 2. It allows us to provide robust fallback code at dlopen time for
42 incorrectly configured systems that mix old libnss_* modules with newly
43 installed libraries e.g. old libnss_nis.so.2 with new libnsl.so.1. Using
44 RTLD_LAZY here causes a failure at the time the symbol is called and at
45 that point it is much harder to safely return an error (Bug 22766).
47 The use of RTLD_NOW also impacts gconv module loading, backtracing
48 (where the unwinder form libgcc_s.so is used), and IDNA functions
49 (which load libidn2), all of which load their respective DSOs on
50 demand, and so should not impact program startup. That is to say
51 that the DSOs are loaded as part of an API call and therefore we
52 will be calling that family of API functions shortly so RTLD_NOW or
53 RTLD_LAZY is not a big difference in performance, but RTLD_NOW has
54 better error handling semantics for the library. */
55 #define __libc_dlopen(name) \
56 __libc_dlopen_mode (name, RTLD_NOW | __RTLD_DLOPEN)
57 extern void *__libc_dlopen_mode (const char *__name, int __mode);
58 extern void *__libc_dlsym (void *__map, const char *__name);
59 extern void *__libc_dlvsym (void *map, const char *name, const char *version);
60 extern int __libc_dlclose (void *__map);
61 libc_hidden_proto (__libc_dlopen_mode)
62 libc_hidden_proto (__libc_dlsym)
63 libc_hidden_proto (__libc_dlvsym)
64 libc_hidden_proto (__libc_dlclose)
66 /* Locate shared object containing the given address. */
67 #ifdef ElfW
68 extern int _dl_addr (const void *address, Dl_info *info,
69 struct link_map **mapp, const ElfW(Sym) **symbolp);
70 libc_hidden_proto (_dl_addr)
71 #endif
73 struct link_map;
75 /* Close an object previously opened by _dl_open. */
76 extern void _dl_close (void *map) attribute_hidden;
77 /* Same as above, but without locking and safety checks for user
78 provided map arguments. */
79 extern void _dl_close_worker (struct link_map *map, bool force)
80 attribute_hidden;
82 /* Look up NAME in shared object HANDLE (which may be RTLD_DEFAULT or
83 RTLD_NEXT). WHO is the calling function, for RTLD_NEXT. Returns
84 the symbol value, which may be NULL. */
85 extern void *_dl_sym (void *handle, const char *name, void *who);
87 /* Look up version VERSION of symbol NAME in shared object HANDLE
88 (which may be RTLD_DEFAULT or RTLD_NEXT). WHO is the calling
89 function, for RTLD_NEXT. Returns the symbol value, which may be
90 NULL. */
91 extern void *_dl_vsym (void *handle, const char *name, const char *version,
92 void *who);
94 /* Helper function for <dlfcn.h> functions. Runs the OPERATE function via
95 _dl_catch_error. Returns zero for success, nonzero for failure; and
96 arranges for `dlerror' to return the error details.
97 ARGS is passed as argument to OPERATE. */
98 extern int _dlerror_run (void (*operate) (void *), void *args)
99 attribute_hidden;
101 #ifdef SHARED
102 # define DL_CALLER_DECL /* Nothing */
103 # define DL_CALLER RETURN_ADDRESS (0)
104 #else
105 # define DL_CALLER_DECL , void *dl_caller
106 # define DL_CALLER dl_caller
107 #endif
109 struct dlfcn_hook
111 void *(*dlopen) (const char *file, int mode, void *dl_caller);
112 int (*dlclose) (void *handle);
113 void *(*dlsym) (void *handle, const char *name, void *dl_caller);
114 void *(*dlvsym) (void *handle, const char *name, const char *version,
115 void *dl_caller);
116 char *(*dlerror) (void);
117 int (*dladdr) (const void *address, Dl_info *info);
118 int (*dladdr1) (const void *address, Dl_info *info,
119 void **extra_info, int flags);
120 int (*dlinfo) (void *handle, int request, void *arg);
121 void *(*dlmopen) (Lmid_t nsid, const char *file, int mode, void *dl_caller);
122 void *pad[4];
125 extern struct dlfcn_hook *_dlfcn_hook;
126 libdl_hidden_proto (_dlfcn_hook)
128 extern void *__dlopen (const char *file, int mode DL_CALLER_DECL)
129 attribute_hidden;
130 extern void *__dlmopen (Lmid_t nsid, const char *file, int mode DL_CALLER_DECL)
131 attribute_hidden;
132 extern int __dlclose (void *handle)
133 attribute_hidden;
134 extern void *__dlsym (void *handle, const char *name DL_CALLER_DECL)
135 attribute_hidden;
136 extern void *__dlvsym (void *handle, const char *name, const char *version
137 DL_CALLER_DECL)
138 attribute_hidden;
139 extern char *__dlerror (void)
140 attribute_hidden;
141 extern int __dladdr (const void *address, Dl_info *info)
142 attribute_hidden;
143 extern int __dladdr1 (const void *address, Dl_info *info,
144 void **extra_info, int flags)
145 attribute_hidden;
146 extern int __dlinfo (void *handle, int request, void *arg) attribute_hidden;
148 #ifndef SHARED
149 struct link_map;
150 extern void * __libc_dlsym_private (struct link_map *map, const char *name)
151 attribute_hidden;
152 extern void __libc_register_dl_open_hook (struct link_map *map)
153 attribute_hidden;
154 extern void __libc_register_dlfcn_hook (struct link_map *map)
155 attribute_hidden;
156 #endif
158 extern void __dlerror_main_freeres (void) attribute_hidden;
160 #endif
161 #endif