-/* dlfcn.h -- User functions for run-time dynamic loading.
- Copyright (C) 1995, 1996 Free Software Foundation, Inc.
+/* User functions for run-time dynamic loading.
+ Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
Boston, MA 02111-1307, USA. */
#ifndef _DLFCN_H
-
#define _DLFCN_H 1
-#include <features.h>
-/* The MODE argument to `dlopen' contains one of the following: */
-#define RTLD_LAZY 0x001 /* Lazy function call binding. */
-#define RTLD_NOW 0x002 /* Immediate function call binding. */
-#define RTLD_BINDING_MASK 0x3 /* Mask of binding time value. */
+#include <features.h>
-/* If the following bit is set in the MODE argument to `dlopen',
- the symbols of the loaded object and its dependencies are made
- visible as if the object were linked directly into the program. */
-#define RTLD_GLOBAL 0x100
+/* Collect various system dependand definitions and declarations. */
+#include <bits/dlfcn.h>
/* If the first argument of `dlsym' is set to RTLD_NEXT the run-time
address of the symbol called NAME in the next shared object is
of the symbol called NAME. */
extern void *dlsym __P ((void *__handle, __const char *__name));
+#ifdef __USE_GNU
+/* Find the run-time address in the shared object HANDLE refers to
+ of the symbol called NAME with VERSION. */
+extern void *__dlvsym __P ((void *__handle, __const char *__name,
+ __const char *__version));
+extern void *dlvsym __P ((void *__handle, __const char *__name,
+ __const char *__version));
+#endif
+
/* When any of the above functions fails, call this function
to return a string describing the error. Each call resets
the error string so that a following call returns null. */
__const char *dli_sname; /* Name of nearest symbol. */
void *dli_saddr; /* Exact value of nearest symbol. */
} Dl_info;
-extern int dladdr __P ((void *__address, Dl_info *__info));
+extern int dladdr __P ((const void *__address, Dl_info *__info));
+
+#ifdef __USE_GNU
+/* To support profiling of shared objects it is a good idea to call
+ the function found using `dlsym' using the following macro since
+ these calls do not use the PLT. But this would mean the dynamic
+ loader has no chance to find out when the function is called. The
+ macro applies the necessary magic so that profiling is possible.
+ Rewrite
+ foo = (*fctp) (arg1, arg2);
+ into
+ foo = DL_CALL_FCT (fctp, (arg1, arg2));
+*/
+# if __GNUC__ >= 2
+/* Do not ever use this variable directly, it is internal! */
+extern struct link_map *_dl_profile_map;
+
+# define DL_CALL_FCT(fctp, args) \
+ (__extension__ ({ if (_dl_profile_map != NULL) \
+ _dl_mcount_wrapper_check (fctp); \
+ (*fctp) args; })
+# else
+/* This feature is not available without GCC. */
+# define DL_CALL_FCT(fctp, args) (*fctp) args
+# endif
+
+/* This function calls the profiling functions. */
+extern void _dl_mcount_wrapper_check __P ((void *__selfpc));
+#endif
__END_DECLS