mirror of
https://sourceware.org/git/glibc.git
synced 2025-09-11 12:10:50 +03:00
dlfcn: Rework static dlopen hooks
Consolidate all hooks structures into a single one. There are no static dlopen ABI concerns because glibc 2.34 already comes with substantial ABI-incompatible changes in this area. (Static dlopen requires the exact same dynamic glibc version that was used for static linking.) The new approach uses a pointer to the hooks structure into _rtld_global_ro and initalizes it in __rtld_static_init. This avoids a back-and-forth with various callback functions. Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
This commit is contained in:
@@ -25,7 +25,7 @@ __dladdr (const void *address, Dl_info *info)
|
|||||||
{
|
{
|
||||||
#ifdef SHARED
|
#ifdef SHARED
|
||||||
if (!rtld_active ())
|
if (!rtld_active ())
|
||||||
return _dlfcn_hook->dladdr (address, info);
|
return GLRO (dl_dlfcn_hook)->dladdr (address, info);
|
||||||
#endif
|
#endif
|
||||||
return _dl_addr (address, info, NULL, NULL);
|
return _dl_addr (address, info, NULL, NULL);
|
||||||
}
|
}
|
||||||
|
@@ -25,7 +25,7 @@ __dladdr1 (const void *address, Dl_info *info, void **extra, int flags)
|
|||||||
{
|
{
|
||||||
#ifdef SHARED
|
#ifdef SHARED
|
||||||
if (!rtld_active ())
|
if (!rtld_active ())
|
||||||
return _dlfcn_hook->dladdr1 (address, info, extra, flags);
|
return GLRO (dl_dlfcn_hook)->dladdr1 (address, info, extra, flags);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
switch (flags)
|
switch (flags)
|
||||||
|
@@ -25,7 +25,7 @@ __dlclose (void *handle)
|
|||||||
{
|
{
|
||||||
#ifdef SHARED
|
#ifdef SHARED
|
||||||
if (!rtld_active ())
|
if (!rtld_active ())
|
||||||
return _dlfcn_hook->dlclose (handle);
|
return GLRO (dl_dlfcn_hook)->dlclose (handle);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return _dlerror_run (GLRO (dl_close), handle) ? -1 : 0;
|
return _dlerror_run (GLRO (dl_close), handle) ? -1 : 0;
|
||||||
|
@@ -33,7 +33,7 @@ __dlerror (void)
|
|||||||
{
|
{
|
||||||
# ifdef SHARED
|
# ifdef SHARED
|
||||||
if (!rtld_active ())
|
if (!rtld_active ())
|
||||||
return _dlfcn_hook->dlerror ();
|
return GLRO (dl_dlfcn_hook)->dlerror ();
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
struct dl_action_result *result = __libc_dlerror_result;
|
struct dl_action_result *result = __libc_dlerror_result;
|
||||||
@@ -197,33 +197,3 @@ _dlerror_run (void (*operate) (void *), void *args)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
libc_hidden_def (_dlerror_run)
|
libc_hidden_def (_dlerror_run)
|
||||||
|
|
||||||
#ifdef SHARED
|
|
||||||
struct dlfcn_hook *_dlfcn_hook __attribute__((nocommon));
|
|
||||||
libc_hidden_data_def (_dlfcn_hook)
|
|
||||||
|
|
||||||
#else /* !SHARED */
|
|
||||||
|
|
||||||
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 /* !SHARED */
|
|
||||||
|
@@ -90,7 +90,7 @@ int
|
|||||||
___dlinfo (void *handle, int request, void *arg)
|
___dlinfo (void *handle, int request, void *arg)
|
||||||
{
|
{
|
||||||
if (!rtld_active ())
|
if (!rtld_active ())
|
||||||
return _dlfcn_hook->dlinfo (handle, request, arg);
|
return GLRO (dl_dlfcn_hook)->dlinfo (handle, request, arg);
|
||||||
else
|
else
|
||||||
return dlinfo_implementation (handle, request, arg);
|
return dlinfo_implementation (handle, request, arg);
|
||||||
}
|
}
|
||||||
|
@@ -81,7 +81,7 @@ void *
|
|||||||
___dlmopen (Lmid_t nsid, const char *file, int mode)
|
___dlmopen (Lmid_t nsid, const char *file, int mode)
|
||||||
{
|
{
|
||||||
if (!rtld_active ())
|
if (!rtld_active ())
|
||||||
return _dlfcn_hook->dlmopen (nsid, file, mode, RETURN_ADDRESS (0));
|
return GLRO (dl_dlfcn_hook)->dlmopen (nsid, file, mode, RETURN_ADDRESS (0));
|
||||||
else
|
else
|
||||||
return dlmopen_implementation (nsid, file, mode, RETURN_ADDRESS (0));
|
return dlmopen_implementation (nsid, file, mode, RETURN_ADDRESS (0));
|
||||||
}
|
}
|
||||||
@@ -101,13 +101,7 @@ __dlmopen (Lmid_t nsid, const char *file, int mode, void *dl_caller)
|
|||||||
void *
|
void *
|
||||||
___dlmopen (Lmid_t nsid, const char *file, int mode)
|
___dlmopen (Lmid_t nsid, const char *file, int mode)
|
||||||
{
|
{
|
||||||
struct link_map *l = __dlmopen (nsid, file, mode, RETURN_ADDRESS (0));
|
return __dlmopen (nsid, file, mode, RETURN_ADDRESS (0));
|
||||||
if (l != NULL)
|
|
||||||
{
|
|
||||||
__libc_register_dl_open_hook (l);
|
|
||||||
__libc_register_dlfcn_hook (l);
|
|
||||||
}
|
|
||||||
return l;
|
|
||||||
}
|
}
|
||||||
weak_alias (___dlmopen, dlmopen)
|
weak_alias (___dlmopen, dlmopen)
|
||||||
static_link_warning (dlmopen)
|
static_link_warning (dlmopen)
|
||||||
|
@@ -76,7 +76,7 @@ void *
|
|||||||
___dlopen (const char *file, int mode)
|
___dlopen (const char *file, int mode)
|
||||||
{
|
{
|
||||||
if (!rtld_active ())
|
if (!rtld_active ())
|
||||||
return _dlfcn_hook->dlopen (file, mode, RETURN_ADDRESS (0));
|
return GLRO (dl_dlfcn_hook)->dlopen (file, mode, RETURN_ADDRESS (0));
|
||||||
else
|
else
|
||||||
return dlopen_implementation (file, mode, RETURN_ADDRESS (0));
|
return dlopen_implementation (file, mode, RETURN_ADDRESS (0));
|
||||||
}
|
}
|
||||||
@@ -96,13 +96,7 @@ __dlopen (const char *file, int mode, void *dl_caller)
|
|||||||
void *
|
void *
|
||||||
___dlopen (const char *file, int mode)
|
___dlopen (const char *file, int mode)
|
||||||
{
|
{
|
||||||
struct link_map *l = __dlopen (file, mode, RETURN_ADDRESS (0));
|
return __dlopen (file, mode, RETURN_ADDRESS (0));
|
||||||
if (l != NULL)
|
|
||||||
{
|
|
||||||
__libc_register_dl_open_hook (l);
|
|
||||||
__libc_register_dlfcn_hook (l);
|
|
||||||
}
|
|
||||||
return l;
|
|
||||||
}
|
}
|
||||||
weak_alias (___dlopen, dlopen)
|
weak_alias (___dlopen, dlopen)
|
||||||
static_link_warning (dlopen)
|
static_link_warning (dlopen)
|
||||||
|
@@ -71,7 +71,7 @@ __dlopen_nocheck (const char *file, int mode)
|
|||||||
args.mode = mode;
|
args.mode = mode;
|
||||||
|
|
||||||
if (!rtld_active ())
|
if (!rtld_active ())
|
||||||
return _dlfcn_hook->dlopen (file, mode, RETURN_ADDRESS (0));
|
return GLRO (dl_dlfcn_hook)->dlopen (file, mode, RETURN_ADDRESS (0));
|
||||||
|
|
||||||
return _dlerror_run (dlopen_doit, &args) ? NULL : args.new;
|
return _dlerror_run (dlopen_doit, &args) ? NULL : args.new;
|
||||||
}
|
}
|
||||||
|
@@ -63,7 +63,7 @@ void *
|
|||||||
___dlsym (void *handle, const char *name)
|
___dlsym (void *handle, const char *name)
|
||||||
{
|
{
|
||||||
if (!rtld_active ())
|
if (!rtld_active ())
|
||||||
return _dlfcn_hook->dlsym (handle, name, RETURN_ADDRESS (0));
|
return GLRO (dl_dlfcn_hook)->dlsym (handle, name, RETURN_ADDRESS (0));
|
||||||
else
|
else
|
||||||
return dlsym_implementation (handle, name, RETURN_ADDRESS (0));
|
return dlsym_implementation (handle, name, RETURN_ADDRESS (0));
|
||||||
}
|
}
|
||||||
|
@@ -66,7 +66,8 @@ void *
|
|||||||
___dlvsym (void *handle, const char *name, const char *version)
|
___dlvsym (void *handle, const char *name, const char *version)
|
||||||
{
|
{
|
||||||
if (!rtld_active ())
|
if (!rtld_active ())
|
||||||
return _dlfcn_hook->dlvsym (handle, name, version, RETURN_ADDRESS (0));
|
return GLRO (dl_dlfcn_hook)->dlvsym (handle, name, version,
|
||||||
|
RETURN_ADDRESS (0));
|
||||||
else
|
else
|
||||||
return dlvsym_implementation (handle, name, version, RETURN_ADDRESS (0));
|
return dlvsym_implementation (handle, name, version, RETURN_ADDRESS (0));
|
||||||
}
|
}
|
||||||
|
@@ -23,7 +23,6 @@ libc {
|
|||||||
GLIBC_PRIVATE {
|
GLIBC_PRIVATE {
|
||||||
# functions used in other libraries
|
# functions used in other libraries
|
||||||
_dl_addr;
|
_dl_addr;
|
||||||
_dl_open_hook; _dl_open_hook2;
|
|
||||||
_dl_sym; _dl_vsym;
|
_dl_sym; _dl_vsym;
|
||||||
__libc_dlclose; __libc_dlopen_mode; __libc_dlsym; __libc_dlvsym;
|
__libc_dlclose; __libc_dlopen_mode; __libc_dlsym; __libc_dlvsym;
|
||||||
__libc_early_init;
|
__libc_early_init;
|
||||||
|
@@ -126,32 +126,7 @@ do_dlclose (void *ptr)
|
|||||||
GLRO(dl_close) ((struct link_map *) ptr);
|
GLRO(dl_close) ((struct link_map *) ptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* This code is to support __libc_dlopen from __libc_dlopen'ed shared
|
#ifndef SHARED
|
||||||
libraries. We need to ensure the statically linked __libc_dlopen
|
|
||||||
etc. functions are used instead of the dynamically loaded. */
|
|
||||||
struct dl_open_hook
|
|
||||||
{
|
|
||||||
void *(*dlopen_mode) (const char *name, int mode);
|
|
||||||
void *(*dlsym) (void *map, const char *name);
|
|
||||||
int (*dlclose) (void *map);
|
|
||||||
void *(*dlvsym) (void *map, const char *name, const char *version);
|
|
||||||
};
|
|
||||||
|
|
||||||
#ifdef SHARED
|
|
||||||
extern struct dl_open_hook *_dl_open_hook;
|
|
||||||
libc_hidden_proto (_dl_open_hook);
|
|
||||||
struct dl_open_hook *_dl_open_hook __attribute__ ((nocommon));
|
|
||||||
libc_hidden_data_def (_dl_open_hook);
|
|
||||||
|
|
||||||
/* The dlvsym member was added retroactively to struct dl_open_hook.
|
|
||||||
Static applications which have it will set _dl_open_hook2 in
|
|
||||||
addition to _dl_open_hook. */
|
|
||||||
extern struct dl_open_hook *_dl_open_hook2;
|
|
||||||
libc_hidden_proto (_dl_open_hook2);
|
|
||||||
struct dl_open_hook *_dl_open_hook2 __attribute__ ((nocommon));
|
|
||||||
libc_hidden_data_def (_dl_open_hook2);
|
|
||||||
|
|
||||||
#else
|
|
||||||
static void
|
static void
|
||||||
do_dlsym_private (void *ptr)
|
do_dlsym_private (void *ptr)
|
||||||
{
|
{
|
||||||
@@ -169,14 +144,6 @@ do_dlsym_private (void *ptr)
|
|||||||
args->map->l_scope, &vers, 0, 0, NULL);
|
args->map->l_scope, &vers, 0, 0, NULL);
|
||||||
args->loadbase = l;
|
args->loadbase = l;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct dl_open_hook _dl_open_hook =
|
|
||||||
{
|
|
||||||
.dlopen_mode = __libc_dlopen_mode,
|
|
||||||
.dlsym = __libc_dlsym,
|
|
||||||
.dlclose = __libc_dlclose,
|
|
||||||
.dlvsym = __libc_dlvsym,
|
|
||||||
};
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* ... and these functions call dlerror_run. */
|
/* ... and these functions call dlerror_run. */
|
||||||
@@ -191,16 +158,9 @@ __libc_dlopen_mode (const char *name, int mode)
|
|||||||
|
|
||||||
#ifdef SHARED
|
#ifdef SHARED
|
||||||
if (!rtld_active ())
|
if (!rtld_active ())
|
||||||
return _dl_open_hook->dlopen_mode (name, mode);
|
return GLRO (dl_dlfcn_hook)->libc_dlopen_mode (name, mode);
|
||||||
return (dlerror_run (do_dlopen, &args) ? NULL : (void *) args.map);
|
|
||||||
#else
|
|
||||||
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
|
#endif
|
||||||
|
return dlerror_run (do_dlopen, &args) ? NULL : (void *) args.map;
|
||||||
}
|
}
|
||||||
libc_hidden_def (__libc_dlopen_mode)
|
libc_hidden_def (__libc_dlopen_mode)
|
||||||
|
|
||||||
@@ -216,21 +176,6 @@ __libc_dlsym_private (struct link_map *map, const char *name)
|
|||||||
return DL_SYMBOL_ADDRESS (sargs.loadbase, sargs.ref);
|
return DL_SYMBOL_ADDRESS (sargs.loadbase, sargs.ref);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
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;
|
|
||||||
|
|
||||||
/* For dlvsym support. */
|
|
||||||
hook = (struct dl_open_hook **) __libc_dlsym_private (map, "_dl_open_hook2");
|
|
||||||
if (hook != NULL)
|
|
||||||
*hook = &_dl_open_hook;
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void *
|
void *
|
||||||
@@ -242,7 +187,7 @@ __libc_dlsym (void *map, const char *name)
|
|||||||
|
|
||||||
#ifdef SHARED
|
#ifdef SHARED
|
||||||
if (!rtld_active ())
|
if (!rtld_active ())
|
||||||
return _dl_open_hook->dlsym (map, name);
|
return GLRO (dl_dlfcn_hook)->libc_dlsym (map, name);
|
||||||
#endif
|
#endif
|
||||||
return (dlerror_run (do_dlsym, &args) ? NULL
|
return (dlerror_run (do_dlsym, &args) ? NULL
|
||||||
: (void *) (DL_SYMBOL_ADDRESS (args.loadbase, args.ref)));
|
: (void *) (DL_SYMBOL_ADDRESS (args.loadbase, args.ref)));
|
||||||
@@ -257,13 +202,7 @@ __libc_dlvsym (void *map, const char *name, const char *version)
|
|||||||
{
|
{
|
||||||
#ifdef SHARED
|
#ifdef SHARED
|
||||||
if (!rtld_active ())
|
if (!rtld_active ())
|
||||||
{
|
return GLRO (dl_dlfcn_hook)->libc_dlvsym (map, name, version);
|
||||||
/* The static application is too old and does not provide the
|
|
||||||
dlvsym hook. */
|
|
||||||
if (_dl_open_hook2 == NULL)
|
|
||||||
return NULL;
|
|
||||||
return _dl_open_hook2->dlvsym (map, name, version);
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
struct do_dlvsym_args args;
|
struct do_dlvsym_args args;
|
||||||
@@ -287,7 +226,7 @@ __libc_dlclose (void *map)
|
|||||||
{
|
{
|
||||||
#ifdef SHARED
|
#ifdef SHARED
|
||||||
if (!rtld_active ())
|
if (!rtld_active ())
|
||||||
return _dl_open_hook->dlclose (map);
|
return GLRO (dl_dlfcn_hook)->libc_dlclose (map);
|
||||||
#endif
|
#endif
|
||||||
return dlerror_run (do_dlclose, map);
|
return dlerror_run (do_dlclose, map);
|
||||||
}
|
}
|
||||||
|
@@ -25,6 +25,23 @@
|
|||||||
|
|
||||||
#include <rtld_static_init.h>
|
#include <rtld_static_init.h>
|
||||||
|
|
||||||
|
static const struct dlfcn_hook _dlfcn_hook =
|
||||||
|
{
|
||||||
|
.dlopen = __dlopen,
|
||||||
|
.dlclose = __dlclose,
|
||||||
|
.dlsym = __dlsym,
|
||||||
|
.dlvsym = __dlvsym,
|
||||||
|
.dlerror = __dlerror,
|
||||||
|
.dladdr = __dladdr,
|
||||||
|
.dladdr1 = __dladdr1,
|
||||||
|
.dlinfo = __dlinfo,
|
||||||
|
.dlmopen = __dlmopen,
|
||||||
|
.libc_dlopen_mode = __libc_dlopen_mode,
|
||||||
|
.libc_dlsym = __libc_dlsym,
|
||||||
|
.libc_dlvsym = __libc_dlvsym,
|
||||||
|
.libc_dlclose = __libc_dlclose,
|
||||||
|
};
|
||||||
|
|
||||||
void
|
void
|
||||||
__rtld_static_init (struct link_map *map)
|
__rtld_static_init (struct link_map *map)
|
||||||
{
|
{
|
||||||
@@ -45,6 +62,7 @@ __rtld_static_init (struct link_map *map)
|
|||||||
extern __typeof (dl->_dl_clktck) _dl_clktck attribute_hidden;
|
extern __typeof (dl->_dl_clktck) _dl_clktck attribute_hidden;
|
||||||
dl->_dl_clktck = _dl_clktck;
|
dl->_dl_clktck = _dl_clktck;
|
||||||
#endif
|
#endif
|
||||||
|
dl->_dl_dlfcn_hook = &_dlfcn_hook;
|
||||||
extern __typeof (dl->_dl_hwcap) _dl_hwcap attribute_hidden;
|
extern __typeof (dl->_dl_hwcap) _dl_hwcap attribute_hidden;
|
||||||
dl->_dl_hwcap = _dl_hwcap;
|
dl->_dl_hwcap = _dl_hwcap;
|
||||||
extern __typeof (dl->_dl_hwcap2) _dl_hwcap2 attribute_hidden;
|
extern __typeof (dl->_dl_hwcap2) _dl_hwcap2 attribute_hidden;
|
||||||
|
@@ -91,8 +91,12 @@ libc_hidden_proto (_dl_vsym)
|
|||||||
extern int _dlerror_run (void (*operate) (void *), void *args);
|
extern int _dlerror_run (void (*operate) (void *), void *args);
|
||||||
libc_hidden_proto (_dlerror_run)
|
libc_hidden_proto (_dlerror_run)
|
||||||
|
|
||||||
|
/* This structure is used to make the outer (statically linked)
|
||||||
|
implementation of dlopen and related functions to the inner libc
|
||||||
|
after static dlopen, via the GLRO (dl_dlfcn_hook) pointer. */
|
||||||
struct dlfcn_hook
|
struct dlfcn_hook
|
||||||
{
|
{
|
||||||
|
/* Public interfaces. */
|
||||||
void *(*dlopen) (const char *file, int mode, void *dl_caller);
|
void *(*dlopen) (const char *file, int mode, void *dl_caller);
|
||||||
int (*dlclose) (void *handle);
|
int (*dlclose) (void *handle);
|
||||||
void *(*dlsym) (void *handle, const char *name, void *dl_caller);
|
void *(*dlsym) (void *handle, const char *name, void *dl_caller);
|
||||||
@@ -104,15 +108,17 @@ struct dlfcn_hook
|
|||||||
void **extra_info, int flags);
|
void **extra_info, int flags);
|
||||||
int (*dlinfo) (void *handle, int request, void *arg);
|
int (*dlinfo) (void *handle, int request, void *arg);
|
||||||
void *(*dlmopen) (Lmid_t nsid, const char *file, int mode, void *dl_caller);
|
void *(*dlmopen) (Lmid_t nsid, const char *file, int mode, void *dl_caller);
|
||||||
void *pad[4];
|
|
||||||
|
/* Internal interfaces. */
|
||||||
|
void* (*libc_dlopen_mode) (const char *__name, int __mode);
|
||||||
|
void* (*libc_dlsym) (void *map, const char *name);
|
||||||
|
void* (*libc_dlvsym) (void *map, const char *name, const char *version);
|
||||||
|
int (*libc_dlclose) (void *map);
|
||||||
};
|
};
|
||||||
|
|
||||||
extern struct dlfcn_hook *_dlfcn_hook;
|
/* Note: These prototypes are for initializing _dlfcn_hook in static
|
||||||
libc_hidden_proto (_dlfcn_hook)
|
builds; see __rtld_static_init. Internal calls in glibc should use
|
||||||
|
the __libc_dl* functions defined in elf/dl-libc.c instead. */
|
||||||
/* Note: These prototypes are for initializing _dflcn_hook in static
|
|
||||||
libraries. Internal calls in glibc should use the __libc_dl*
|
|
||||||
functions defined in elf/dl-libc.c instead. */
|
|
||||||
|
|
||||||
extern void *__dlopen (const char *file, int mode, void *caller);
|
extern void *__dlopen (const char *file, int mode, void *caller);
|
||||||
extern void *__dlmopen (Lmid_t nsid, const char *file, int mode,
|
extern void *__dlmopen (Lmid_t nsid, const char *file, int mode,
|
||||||
@@ -125,16 +131,7 @@ extern int __dladdr (const void *address, Dl_info *info);
|
|||||||
extern int __dladdr1 (const void *address, Dl_info *info,
|
extern int __dladdr1 (const void *address, Dl_info *info,
|
||||||
void **extra_info, int flags);
|
void **extra_info, int flags);
|
||||||
extern int __dlinfo (void *handle, int request, void *arg);
|
extern int __dlinfo (void *handle, int request, void *arg);
|
||||||
|
extern char *__dlerror (void);
|
||||||
#ifndef SHARED
|
|
||||||
struct link_map;
|
|
||||||
extern void * __libc_dlsym_private (struct link_map *map, const char *name)
|
|
||||||
attribute_hidden;
|
|
||||||
extern void __libc_register_dl_open_hook (struct link_map *map)
|
|
||||||
attribute_hidden;
|
|
||||||
extern void __libc_register_dlfcn_hook (struct link_map *map)
|
|
||||||
attribute_hidden;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
@@ -687,6 +687,9 @@ struct rtld_global_ro
|
|||||||
int (*_dl_discover_osversion) (void);
|
int (*_dl_discover_osversion) (void);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* Dynamic linker operations used after static dlopen. */
|
||||||
|
const struct dlfcn_hook *_dl_dlfcn_hook;
|
||||||
|
|
||||||
/* List of auditing interfaces. */
|
/* List of auditing interfaces. */
|
||||||
struct audit_ifaces *_dl_audit;
|
struct audit_ifaces *_dl_audit;
|
||||||
unsigned int _dl_naudit;
|
unsigned int _dl_naudit;
|
||||||
|
Reference in New Issue
Block a user