about summary refs log tree commit diff
path: root/elf/dlfcn.h
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>1998-06-18 16:51:12 +0000
committerUlrich Drepper <drepper@redhat.com>1998-06-18 16:51:12 +0000
commit5ad49c070734c57f35cfe045572fb22158870c78 (patch)
treed17a62167c0996bbe744522fcb819446817cdc04 /elf/dlfcn.h
parent2827300fbe8b237b825aa29b95f24026aedd4b20 (diff)
downloadglibc-5ad49c070734c57f35cfe045572fb22158870c78.tar.gz
glibc-5ad49c070734c57f35cfe045572fb22158870c78.tar.xz
glibc-5ad49c070734c57f35cfe045572fb22158870c78.zip
Update.
1998-06-18 16:40  Ulrich Drepper  <drepper@cygnus.com>

	* libc.map: Add _dl_profile_map, _dl_profile_output, _dl_start_profile,
	_dl_mcount, _dl_mcount_wrapper.
	* elf/Makefile (routines): Add dl-profstub.
	* elf/dl-profstub.c: New file.
	* elf/dl-support.c: Don't define _dl_profile_map.
	* elf/rtld.c: Likewise.
	* elf/dlfcn.h: Define DL_CALL_FCT macro.
	* elf/ldsodefs.h: Declare _dl_profile_output, _dl_mcount_wrapper.
	Define _CALL_DL_FCT.
	* iconv/gconv.c: Use _CALL_DL_FCT to call function from dynamically
	loaded object.
	* iconv/gconv_db.c: Likewise.
	* iconv/skeleton.c: Likewise.
	* nss/getXXbyYY_r.c: Likewise.
	* nss/getXXent_r.c: Likewise.
	* nss/nsswitch.c: Likewise.
Diffstat (limited to 'elf/dlfcn.h')
-rw-r--r--elf/dlfcn.h30
1 files changed, 29 insertions, 1 deletions
diff --git a/elf/dlfcn.h b/elf/dlfcn.h
index 825b4843c1..e0b17d392a 100644
--- a/elf/dlfcn.h
+++ b/elf/dlfcn.h
@@ -1,5 +1,5 @@
 /* User functions for run-time dynamic loading.
-   Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc.
+   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
@@ -70,6 +70,34 @@ typedef struct
   } Dl_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
 
 #endif	/* dlfcn.h */