about summary refs log tree commit diff
path: root/elf/dl-libc.c
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2004-10-18 23:07:59 +0000
committerUlrich Drepper <drepper@redhat.com>2004-10-18 23:07:59 +0000
commit790b6c7a7f65dec508a2e71e6d922ec166640afc (patch)
treed1965a031f2597361ec4e6a8ce0b02e08390e6fd /elf/dl-libc.c
parent761bbac5d8eda6fa26188cb8a3847aaeb4877feb (diff)
downloadglibc-790b6c7a7f65dec508a2e71e6d922ec166640afc.tar.gz
glibc-790b6c7a7f65dec508a2e71e6d922ec166640afc.tar.xz
glibc-790b6c7a7f65dec508a2e71e6d922ec166640afc.zip
(__libc_dlsym_private, __libc_register_dl_open_hook): New functions. (__libc_dlopen_mode): Call __libc_register_dl_open_hook and __libc_register_dlfcn_hook.
Diffstat (limited to 'elf/dl-libc.c')
-rw-r--r--elf/dl-libc.c38
1 files changed, 25 insertions, 13 deletions
diff --git a/elf/dl-libc.c b/elf/dl-libc.c
index 2602feb2c1..8a3f542e01 100644
--- a/elf/dl-libc.c
+++ b/elf/dl-libc.c
@@ -121,7 +121,6 @@ do_dlsym_private (void *ptr)
   vers.hidden = 1;
   /* vers.hash = _dl_elf_hash (version);  */
   vers.hash = 0x0963cf85;
-  /* FIXME: Shouldn't we use libc.so.6* here?  */
   vers.filename = NULL;
 
   struct do_dlsym_args *args = (struct do_dlsym_args *) ptr;
@@ -156,23 +155,36 @@ __libc_dlopen_mode (const char *name, int mode)
   if (dlerror_run (do_dlopen, &args))
     return NULL;
 
+  __libc_register_dl_open_hook (args.map);
+  __libc_register_dlfcn_hook (args.map);
+  return (void *) args.map;
+#endif
+}
+libc_hidden_def (__libc_dlopen_mode)
+
+#ifndef SHARED
+void *
+__libc_dlsym_private (struct link_map *map, const char *name)
+{
   struct do_dlsym_args sargs;
-  sargs.map = args.map;
-  sargs.name = "_dl_open_hook";
+  sargs.map = map;
+  sargs.name = name;
 
   if (! dlerror_run (do_dlsym_private, &sargs))
-    {
-      struct dl_open_hook **hook
-	= (struct dl_open_hook **)
-	  (DL_SYMBOL_ADDRESS (sargs.loadbase, sargs.ref));
-      if (hook != NULL)
-	*hook = &_dl_open_hook;
-    }
+    return DL_SYMBOL_ADDRESS (sargs.loadbase, sargs.ref);
+  return NULL;
+}
 
-  return (void *) args.map;
-#endif
+void
+__libc_register_dl_open_hook (struct link_map *map)
+{
+  struct dl_open_hook **hook;
+
+  hook = (struct dl_open_hook **) __libc_dlsym_private (map, "_dl_open_hook");
+  if (hook != NULL)
+    *hook = &_dl_open_hook;
 }
-libc_hidden_def (__libc_dlopen_mode)
+#endif
 
 void *
 __libc_dlsym (void *map, const char *name)