* nis/nis_table.c (nis_list): Optimize freeing and reallocation of
[glibc.git] / include / dlfcn.h
blob9144dd2f3fb368d30a4e68eaf5dc4cf33f7ddded
1 #ifndef _DLFCN_H
2 #include <dlfcn/dlfcn.h>
3 #include <link.h> /* For ElfW. */
4 #include <stdbool.h>
6 /* Internally used flag. */
7 #define __RTLD_DLOPEN 0x80000000
8 #define __RTLD_SPROF 0x40000000
9 #define __RTLD_OPENEXEC 0x20000000
10 #define __RTLD_CALLMAP 0x10000000
11 #define __RTLD_AUDIT 0x08000000
13 #define __LM_ID_CALLER -2
15 #ifdef SHARED
16 /* Locally stored program arguments. */
17 extern int __dlfcn_argc attribute_hidden;
18 extern char **__dlfcn_argv attribute_hidden;
19 #else
20 /* These variables are defined and initialized in the startup code. */
21 extern int __libc_argc attribute_hidden;
22 extern char **__libc_argv attribute_hidden;
24 # define __dlfcn_argc __libc_argc
25 # define __dlfcn_argv __libc_argv
26 #endif
29 /* Now define the internal interfaces. */
31 #define __libc_dlopen(name) \
32 __libc_dlopen_mode (name, RTLD_LAZY | __RTLD_DLOPEN)
33 extern void *__libc_dlopen_mode (__const char *__name, int __mode);
34 extern void *__libc_dlsym (void *__map, __const char *__name);
35 extern int __libc_dlclose (void *__map);
36 libc_hidden_proto (__libc_dlopen_mode)
37 libc_hidden_proto (__libc_dlsym)
38 libc_hidden_proto (__libc_dlclose)
40 /* Locate shared object containing the given address. */
41 #ifdef ElfW
42 extern int _dl_addr (const void *address, Dl_info *info,
43 struct link_map **mapp, const ElfW(Sym) **symbolp)
44 internal_function;
45 libc_hidden_proto (_dl_addr)
46 #endif
48 /* Close an object previously opened by _dl_open. */
49 extern void _dl_close (void *map) attribute_hidden;
51 /* Look up NAME in shared object HANDLE (which may be RTLD_DEFAULT or
52 RTLD_NEXT). WHO is the calling function, for RTLD_NEXT. Returns
53 the symbol value, which may be NULL. */
54 extern void *_dl_sym (void *handle, const char *name, void *who)
55 internal_function;
57 /* Look up version VERSION of symbol NAME in shared object HANDLE
58 (which may be RTLD_DEFAULT or RTLD_NEXT). WHO is the calling
59 function, for RTLD_NEXT. Returns the symbol value, which may be
60 NULL. */
61 extern void *_dl_vsym (void *handle, const char *name, const char *version,
62 void *who)
63 internal_function;
65 /* Call OPERATE, catching errors from `dl_signal_error'. If there is no
66 error, *ERRSTRING is set to null. If there is an error, *ERRSTRING is
67 set to a string constructed from the strings passed to _dl_signal_error,
68 and the error code passed is the return value and *OBJNAME is set to
69 the object name which experienced the problems. ERRSTRING if nonzero
70 points to a malloc'ed string which the caller has to free after use.
71 ARGS is passed as argument to OPERATE. MALLOCEDP is set to true only
72 if the returned string is allocated using the libc's malloc. */
73 extern int _dl_catch_error (const char **objname, const char **errstring,
74 bool *mallocedp, void (*operate) (void *),
75 void *args)
76 internal_function;
78 /* Helper function for <dlfcn.h> functions. Runs the OPERATE function via
79 _dl_catch_error. Returns zero for success, nonzero for failure; and
80 arranges for `dlerror' to return the error details.
81 ARGS is passed as argument to OPERATE. */
82 extern int _dlerror_run (void (*operate) (void *), void *args)
83 internal_function;
85 #ifdef SHARED
86 # define DL_CALLER_DECL /* Nothing */
87 # define DL_CALLER RETURN_ADDRESS (0)
88 #else
89 # define DL_CALLER_DECL , void *dl_caller
90 # define DL_CALLER dl_caller
91 #endif
93 struct dlfcn_hook
95 void *(*dlopen) (const char *file, int mode, void *dl_caller);
96 int (*dlclose) (void *handle);
97 void *(*dlsym) (void *handle, const char *name, void *dl_caller);
98 void *(*dlvsym) (void *handle, const char *name, const char *version,
99 void *dl_caller);
100 char *(*dlerror) (void);
101 int (*dladdr) (const void *address, Dl_info *info);
102 int (*dladdr1) (const void *address, Dl_info *info,
103 void **extra_info, int flags);
104 int (*dlinfo) (void *handle, int request, void *arg, void *dl_caller);
105 void *(*dlmopen) (Lmid_t nsid, const char *file, int mode, void *dl_caller);
106 void *pad[4];
109 extern struct dlfcn_hook *_dlfcn_hook;
110 libdl_hidden_proto (_dlfcn_hook)
112 extern void *__dlopen (const char *file, int mode DL_CALLER_DECL)
113 attribute_hidden;
114 extern void *__dlmopen (Lmid_t nsid, const char *file, int mode DL_CALLER_DECL)
115 attribute_hidden;
116 extern int __dlclose (void *handle)
117 attribute_hidden;
118 extern void *__dlsym (void *handle, const char *name DL_CALLER_DECL)
119 attribute_hidden;
120 extern void *__dlvsym (void *handle, const char *name, const char *version
121 DL_CALLER_DECL)
122 attribute_hidden;
123 extern char *__dlerror (void)
124 attribute_hidden;
125 extern int __dladdr (const void *address, Dl_info *info)
126 attribute_hidden;
127 extern int __dladdr1 (const void *address, Dl_info *info,
128 void **extra_info, int flags)
129 attribute_hidden;
130 extern int __dlinfo (void *handle, int request, void *arg DL_CALLER_DECL)
131 attribute_hidden;
133 #ifndef SHARED
134 struct link_map;
135 extern void * __libc_dlsym_private (struct link_map *map, const char *name)
136 attribute_hidden;
137 extern void __libc_register_dl_open_hook (struct link_map *map)
138 attribute_hidden;
139 extern void __libc_register_dlfcn_hook (struct link_map *map)
140 attribute_hidden;
141 #endif
143 #endif