Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Update.
2004-10-18  Jakub Jelinek  <jakub@redhat.com>

	* elf/dl-libc.c (__libc_dlsym_private, __libc_register_dl_open_hook):
	New functions.
	(__libc_dlopen_mode): Call __libc_register_dl_open_hook and
	__libc_register_dlfcn_hook.
	* dlfcn/Makefile (routines, elide-routines.os): Set.
	Add rules to build and test tststatic2.
	* dlfcn/tststatic2.c: New test.
	* dlfcn/modstatic2.c: New test module.
	* dlfcn/dladdr.c: Call _dlfcn_hook from libdl.so if not NULL.
	Define __ prefixed routine in libc.a and in libdl.a just call it.
	* dlfcn/dladdr1.c: Likewise.
	* dlfcn/dlclose.c: Likewise.
	* dlfcn/dlerror.c: Likewise.
	* dlfcn/dlinfo.c: Likewise.
	* dlfcn/dlmopen.c: Likewise.
	* dlfcn/dlopen.c: Likewise.
	* dlfcn/dlopenold.c: Likewise.
	* dlfcn/dlsym.c: Likewise.
	* dlfcn/dlvsym.c: Likewise.
	* dlfcn/sdladdr.c: New file.
	* dlfcn/sdladdr1.c: New file.
	* dlfcn/sdlclose.c: New file.
	* dlfcn/sdlerror.c: New file.
	* dlfcn/sdlinfo.c: New file.
	* dlfcn/sdlopen.c: New file.
	* dlfcn/sdlsym.c: New file.
	* dlfcn/sdlvsym.c: New file.
	* dlfcn/Versions (libdl): Export _dlfcn_hook@GLIBC_PRIVATE.
	* include/dlfcn.h (DL_CALLER_DECL, DL_CALLER RETURN_ADDRESS): Define.
	(struct dlfcn_hook): New type.
	(_dlfcn_hook): New extern decl.
	(__dlopen, __dlclose, __dlsym, __dlerror, __dladdr, __dladdr1,
	__dlinfo, __dlmopen, __libc_dlsym_private,
	__libc_register_dl_open_hook, __libc_register_dlfcn_hook): New
	prototypes.
	(__dlvsym): Use DL_CALLER_DECL.
	* include/libc-symbols.h: Define libdl_hidden_proto and friends.

	* malloc/arena.c (_dl_open_hook): Extern decl.
	(ptmalloc_init): Don't call _dl_addr when dlopened from statically
	linked programs but don't use brk for them either.
  • Loading branch information
Ulrich Drepper committed Oct 18, 2004
1 parent 790b6c7 commit 5f21997
Show file tree
Hide file tree
Showing 27 changed files with 803 additions and 38 deletions.
44 changes: 44 additions & 0 deletions ChangeLog
@@ -1,3 +1,47 @@
2004-10-18 Jakub Jelinek <jakub@redhat.com>

* elf/dl-libc.c (__libc_dlsym_private, __libc_register_dl_open_hook):
New functions.
(__libc_dlopen_mode): Call __libc_register_dl_open_hook and
__libc_register_dlfcn_hook.
* dlfcn/Makefile (routines, elide-routines.os): Set.
Add rules to build and test tststatic2.
* dlfcn/tststatic2.c: New test.
* dlfcn/modstatic2.c: New test module.
* dlfcn/dladdr.c: Call _dlfcn_hook from libdl.so if not NULL.
Define __ prefixed routine in libc.a and in libdl.a just call it.
* dlfcn/dladdr1.c: Likewise.
* dlfcn/dlclose.c: Likewise.
* dlfcn/dlerror.c: Likewise.
* dlfcn/dlinfo.c: Likewise.
* dlfcn/dlmopen.c: Likewise.
* dlfcn/dlopen.c: Likewise.
* dlfcn/dlopenold.c: Likewise.
* dlfcn/dlsym.c: Likewise.
* dlfcn/dlvsym.c: Likewise.
* dlfcn/sdladdr.c: New file.
* dlfcn/sdladdr1.c: New file.
* dlfcn/sdlclose.c: New file.
* dlfcn/sdlerror.c: New file.
* dlfcn/sdlinfo.c: New file.
* dlfcn/sdlopen.c: New file.
* dlfcn/sdlsym.c: New file.
* dlfcn/sdlvsym.c: New file.
* dlfcn/Versions (libdl): Export _dlfcn_hook@GLIBC_PRIVATE.
* include/dlfcn.h (DL_CALLER_DECL, DL_CALLER RETURN_ADDRESS): Define.
(struct dlfcn_hook): New type.
(_dlfcn_hook): New extern decl.
(__dlopen, __dlclose, __dlsym, __dlerror, __dladdr, __dladdr1,
__dlinfo, __dlmopen, __libc_dlsym_private,
__libc_register_dl_open_hook, __libc_register_dlfcn_hook): New
prototypes.
(__dlvsym): Use DL_CALLER_DECL.
* include/libc-symbols.h: Define libdl_hidden_proto and friends.

* malloc/arena.c (_dl_open_hook): Extern decl.
(ptmalloc_init): Don't call _dl_addr when dlopened from statically
linked programs but don't use brk for them either.

2004-10-18 Roland McGrath <roland@redhat.com>

* dlfcn/bug-dlsym1.c (main): Remove bogus setenv call.
Expand Down
18 changes: 13 additions & 5 deletions dlfcn/Makefile
Expand Up @@ -21,9 +21,11 @@ headers := bits/dlfcn.h dlfcn.h
extra-libs := libdl
libdl-routines := dlopen dlclose dlsym dlvsym dlerror dladdr dladdr1 dlinfo \
dlmopen
routines := $(patsubst %,s%,$(libdl-routines))
elide-routines.os := $(routines)
distribute := dlopenold.c glreflib1.c glreflib2.c failtestmod.c \
defaultmod1.c defaultmod2.c errmsg1mod.c modatexit.c \
modcxaatexit.c modstatic.c \
modcxaatexit.c modstatic.c modstatic2.c \
bug-dlsym1-lib1.c bug-dlsym1-lib2.c

extra-libs-others := libdl
Expand Down Expand Up @@ -51,10 +53,11 @@ glreflib2.so-no-z-defs = yes
errmsg1mod.so-no-z-defs = yes

ifeq (yesyesyes,$(build-static)$(build-shared)$(elf))
tests += tststatic
tests-static += tststatic
modules-names += modstatic
tests += tststatic tststatic2
tests-static += tststatic tststatic2
modules-names += modstatic modstatic2
tststatic-ENV = LD_LIBRARY_PATH=$(objpfx):$(common-objpfx):$(common-objpfx)elf
tststatic2-ENV = LD_LIBRARY_PATH=$(objpfx):$(common-objpfx):$(common-objpfx)elf
endif

extra-objs += $(modules-names:=.os)
Expand Down Expand Up @@ -106,7 +109,12 @@ $(objpfx)modatexit.so: $(common-objpfx)libc.so $(common-objpfx)libc_nonshared.a
$(objpfx)tststatic: $(objpfx)libdl.a
$(objpfx)tststatic.out: $(objpfx)tststatic $(objpfx)modstatic.so

$(objpfx)modstatic.so: $(common-objpfx)libc.so $(common-objpfx)libc_nonshared.a
$(objpfx)tststatic2: $(objpfx)libdl.a
$(objpfx)tststatic2.out: $(objpfx)tststatic2 $(objpfx)modstatic.so \
$(objpfx)modstatic2.so

$(objpfx)modstatic2.so: $(libdl) $(common-objpfx)libc.so \
$(common-objpfx)libc_nonshared.a

$(objpfx)bug-dlopen1: $(libdl)

Expand Down
3 changes: 3 additions & 0 deletions dlfcn/Versions
Expand Up @@ -11,4 +11,7 @@ libdl {
GLIBC_2.3.4 {
dlmopen;
}
GLIBC_PRIVATE {
_dlfcn_hook;
}
}
21 changes: 20 additions & 1 deletion dlfcn/dladdr.c
@@ -1,5 +1,6 @@
/* Locate the shared object symbol nearest a given address.
Copyright (C) 1996, 1997, 1998, 1999, 2003 Free Software Foundation, Inc.
Copyright (C) 1996, 1997, 1998, 1999, 2003, 2004
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
Expand All @@ -19,8 +20,26 @@

#include <dlfcn.h>

#if !defined SHARED && defined IS_IN_libdl

int
dladdr (const void *address, Dl_info *info)
{
return __dladdr (address, info);
}

#else

int
__dladdr (const void *address, Dl_info *info)
{
# ifdef SHARED
if (__builtin_expect (_dlfcn_hook != NULL, 0))
return _dlfcn_hook->dladdr (address, info);
# endif
return _dl_addr (address, info, NULL, NULL);
}
# ifdef SHARED
strong_alias (__dladdr, dladdr)
# endif
#endif
21 changes: 20 additions & 1 deletion dlfcn/dladdr1.c
@@ -1,5 +1,5 @@
/* Locate the shared object symbol nearest a given address.
Copyright (C) 2003 Free Software Foundation, Inc.
Copyright (C) 2003, 2004 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
Expand All @@ -19,9 +19,24 @@

#include <dlfcn.h>

#if !defined SHARED && defined IS_IN_libdl

int
dladdr1 (const void *address, Dl_info *info, void **extra, int flags)
{
return __dladdr1 (address, info, extra, flags);
}

#else

int
__dladdr1 (const void *address, Dl_info *info, void **extra, int flags)
{
# ifdef SHARED
if (__builtin_expect (_dlfcn_hook != NULL, 0))
return _dlfcn_hook->dladdr1 (address, info, extra, flags);
# endif

switch (flags)
{
default: /* Make this an error? */
Expand All @@ -33,3 +48,7 @@ dladdr1 (const void *address, Dl_info *info, void **extra, int flags)
return _dl_addr (address, info, (struct link_map **) extra, NULL);
}
}
# ifdef SHARED
strong_alias (__dladdr1, dladdr1)
# endif
#endif
24 changes: 22 additions & 2 deletions dlfcn/dlclose.c
@@ -1,5 +1,6 @@
/* Close a handle opened by `dlopen'.
Copyright (C) 1995, 1996, 1997, 1998, 1999 Free Software Foundation, Inc.
Copyright (C) 1995, 1996, 1997, 1998, 1999, 2004
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
Expand All @@ -19,14 +20,33 @@

#include <dlfcn.h>

#if !defined SHARED && defined IS_IN_libdl

int
dlclose (void *handle)
{
return __dlclose (handle);
}

#else

static void
dlclose_doit (void *handle)
{
_dl_close (handle);
}

int
dlclose (void *handle)
__dlclose (void *handle)
{
# ifdef SHARED
if (__builtin_expect (_dlfcn_hook != NULL, 0))
return _dlfcn_hook->dlclose (handle);
# endif

return _dlerror_run (dlclose_doit, handle) ? -1 : 0;
}
# ifdef SHARED
strong_alias (__dlclose, dlclose)
# endif
#endif
52 changes: 51 additions & 1 deletion dlfcn/dlerror.c
Expand Up @@ -25,6 +25,16 @@
#include <bits/libc-lock.h>
#include <ldsodefs.h>

#if !defined SHARED && defined IS_IN_libdl

char *
dlerror (void)
{
return __dlerror ();
}

#else

/* Type for storing results of dynamic loading actions. */
struct dl_action_result
{
Expand All @@ -46,11 +56,16 @@ static void free_key_mem (void *mem);


char *
dlerror (void)
__dlerror (void)
{
char *buf = NULL;
struct dl_action_result *result;

# ifdef SHARED
if (__builtin_expect (_dlfcn_hook != NULL, 0))
return _dlfcn_hook->dlerror ();
# endif

/* If we have not yet initialized the buffer do it now. */
__libc_once (once, init);

Expand Down Expand Up @@ -99,6 +114,9 @@ dlerror (void)

return buf;
}
# ifdef SHARED
strong_alias (__dlerror, dlerror)
# endif

int
internal_function
Expand Down Expand Up @@ -185,3 +203,35 @@ free_key_mem (void *mem)
free (mem);
__libc_setspecific (key, NULL);
}

# ifdef SHARED

struct dlfcn_hook *_dlfcn_hook __attribute__((nocommon));
libdl_hidden_data_def (_dlfcn_hook)

# else

static struct dlfcn_hook _dlfcn_hooks =
{
.dlopen = __dlopen,
.dlclose = __dlclose,
.dlsym = __dlsym,
.dlvsym = __dlvsym,
.dlerror = __dlerror,
.dladdr = __dladdr,
.dladdr1 = __dladdr1,
.dlinfo = __dlinfo,
.dlmopen = __dlmopen
};

void
__libc_register_dlfcn_hook (struct link_map *map)
{
struct dlfcn_hook **hook;

hook = (struct dlfcn_hook **) __libc_dlsym_private (map, "_dlfcn_hook");
if (hook != NULL)
*hook = &_dlfcn_hooks;
}
# endif
#endif
28 changes: 24 additions & 4 deletions dlfcn/dlinfo.c
Expand Up @@ -22,6 +22,16 @@
#include <ldsodefs.h>
#include <libintl.h>

#if !defined SHARED && defined IS_IN_libdl

int
dlinfo (void *handle, int request, void *arg)
{
return __dlinfo (handle, request, arg, RETURN_ADDRESS (0));
}

#else

struct dlinfo_args
{
ElfW(Addr) caller;
Expand All @@ -36,7 +46,7 @@ dlinfo_doit (void *argsblock)
struct dlinfo_args *const args = argsblock;
struct link_map *l = args->handle;

#if 0
# if 0
if (args->handle == RTLD_SELF)
{
Lmid_t nsid;
Expand All @@ -53,7 +63,7 @@ dlinfo_doit (void *argsblock)
GLRO(dl_signal_error) (0, NULL, NULL, N_("\
RTLD_SELF used in code not dynamically loaded"));
}
#endif
# endif

switch (args->request)
{
Expand Down Expand Up @@ -84,9 +94,19 @@ RTLD_SELF used in code not dynamically loaded"));
}

int
dlinfo (void *handle, int request, void *arg)
__dlinfo (void *handle, int request, void *arg DL_CALLER_DECL)
{
struct dlinfo_args args = { (ElfW(Addr)) RETURN_ADDRESS (0),
# ifdef SHARED
if (__builtin_expect (_dlfcn_hook != NULL, 0))
return _dlfcn_hook->dlinfo (handle, request, arg,
DL_CALLER);
# endif

struct dlinfo_args args = { (ElfW(Addr)) DL_CALLER,
handle, request, arg };
return _dlerror_run (&dlinfo_doit, &args) ? -1 : 0;
}
# ifdef SHARED
strong_alias (__dlinfo, dlinfo)
# endif
#endif

0 comments on commit 5f21997

Please sign in to comment.