From: Adhemerval Zanella <adhemerval.zanella@linaro.org>
To: Florian Weimer <fweimer@redhat.com>, libc-alpha@sourceware.org
Subject: Re: [PATCH 16/16] dlfcn: Rework static dlopen hooks
Date: Wed, 2 Jun 2021 16:18:37 -0300 [thread overview]
Message-ID: <da01049b-4d53-9165-a09d-b842bc9aea41@linaro.org> (raw)
In-Reply-To: <3c052fb456744cea69254e95a78a331579068b55.1622469909.git.fweimer@redhat.com>
On 31/05/2021 11:12, Florian Weimer via Libc-alpha wrote:
> 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 chagnes in this area. (Static
Typo 'chagnes'.
> 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.
LGTM, thanks.
Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
> ---
> dlfcn/dladdr.c | 2 +-
> dlfcn/dladdr1.c | 2 +-
> dlfcn/dlclose.c | 2 +-
> dlfcn/dlerror.c | 32 +----------------
> dlfcn/dlinfo.c | 2 +-
> dlfcn/dlmopen.c | 10 ++----
> dlfcn/dlopen.c | 10 ++----
> dlfcn/dlopenold.c | 2 +-
> dlfcn/dlsym.c | 2 +-
> dlfcn/dlvsym.c | 3 +-
> elf/Versions | 1 -
> elf/dl-libc.c | 73 ++++----------------------------------
> elf/rtld_static_init.c | 18 ++++++++++
> include/dlfcn.h | 31 ++++++++--------
> sysdeps/generic/ldsodefs.h | 3 ++
> 15 files changed, 54 insertions(+), 139 deletions(-)
>
> diff --git a/dlfcn/dladdr.c b/dlfcn/dladdr.c
> index 3ef1b7f0b6..1cc305f0c4 100644
> --- a/dlfcn/dladdr.c
> +++ b/dlfcn/dladdr.c
> @@ -25,7 +25,7 @@ __dladdr (const void *address, Dl_info *info)
> {
> #ifdef SHARED
> if (!rtld_active ())
> - return _dlfcn_hook->dladdr (address, info);
> + return GLRO (dl_dlfcn_hook)->dladdr (address, info);
> #endif
> return _dl_addr (address, info, NULL, NULL);
> }
Ok.
> diff --git a/dlfcn/dladdr1.c b/dlfcn/dladdr1.c
> index 203d6398e4..78560dbac2 100644
> --- a/dlfcn/dladdr1.c
> +++ b/dlfcn/dladdr1.c
> @@ -25,7 +25,7 @@ __dladdr1 (const void *address, Dl_info *info, void **extra, int flags)
> {
> #ifdef SHARED
> if (!rtld_active ())
> - return _dlfcn_hook->dladdr1 (address, info, extra, flags);
> + return GLRO (dl_dlfcn_hook)->dladdr1 (address, info, extra, flags);
> #endif
>
> switch (flags)
Ok.
> diff --git a/dlfcn/dlclose.c b/dlfcn/dlclose.c
> index 4d5d307ab1..6a013a81bb 100644
> --- a/dlfcn/dlclose.c
> +++ b/dlfcn/dlclose.c
> @@ -25,7 +25,7 @@ __dlclose (void *handle)
> {
> #ifdef SHARED
> if (!rtld_active ())
> - return _dlfcn_hook->dlclose (handle);
> + return GLRO (dl_dlfcn_hook)->dlclose (handle);
> #endif
>
> return _dlerror_run (GLRO (dl_close), handle) ? -1 : 0;
Ok.
> diff --git a/dlfcn/dlerror.c b/dlfcn/dlerror.c
> index 3df8602f4d..d0194a7cef 100644
> --- a/dlfcn/dlerror.c
> +++ b/dlfcn/dlerror.c
> @@ -33,7 +33,7 @@ __dlerror (void)
> {
> # ifdef SHARED
> if (!rtld_active ())
> - return _dlfcn_hook->dlerror ();
> + return GLRO (dl_dlfcn_hook)->dlerror ();
> # endif
>
> struct dl_action_result *result = __libc_dlerror_result;
> @@ -197,33 +197,3 @@ _dlerror_run (void (*operate) (void *), void *args)
> }
> }
> 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 */
Ok.
> diff --git a/dlfcn/dlinfo.c b/dlfcn/dlinfo.c
> index 15fcbc5dc1..c6f9a1da09 100644
> --- a/dlfcn/dlinfo.c
> +++ b/dlfcn/dlinfo.c
> @@ -90,7 +90,7 @@ int
> ___dlinfo (void *handle, int request, void *arg)
> {
> if (!rtld_active ())
> - return _dlfcn_hook->dlinfo (handle, request, arg);
> + return GLRO (dl_dlfcn_hook)->dlinfo (handle, request, arg);
> else
> return dlinfo_implementation (handle, request, arg);
> }
Ok.
> diff --git a/dlfcn/dlmopen.c b/dlfcn/dlmopen.c
> index ae42814bbf..c171c8953d 100644
> --- a/dlfcn/dlmopen.c
> +++ b/dlfcn/dlmopen.c
> @@ -81,7 +81,7 @@ void *
> ___dlmopen (Lmid_t nsid, const char *file, int mode)
> {
> 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
> 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 *
> ___dlmopen (Lmid_t nsid, const char *file, int mode)
> {
> - struct link_map *l = __dlmopen (nsid, file, mode, RETURN_ADDRESS (0));
> - if (l != NULL)
> - {
> - __libc_register_dl_open_hook (l);
> - __libc_register_dlfcn_hook (l);
> - }
> - return l;
> + return __dlmopen (nsid, file, mode, RETURN_ADDRESS (0));
> }
> weak_alias (___dlmopen, dlmopen)
> static_link_warning (dlmopen)
Ok.
> diff --git a/dlfcn/dlopen.c b/dlfcn/dlopen.c
> index afdc113efb..e04b374b82 100644
> --- a/dlfcn/dlopen.c
> +++ b/dlfcn/dlopen.c
> @@ -76,7 +76,7 @@ void *
> ___dlopen (const char *file, int mode)
> {
> if (!rtld_active ())
> - return _dlfcn_hook->dlopen (file, mode, RETURN_ADDRESS (0));
> + return GLRO (dl_dlfcn_hook)->dlopen (file, mode, RETURN_ADDRESS (0));
> else
> return dlopen_implementation (file, mode, RETURN_ADDRESS (0));
> }
> @@ -96,13 +96,7 @@ __dlopen (const char *file, int mode, void *dl_caller)
> void *
> ___dlopen (const char *file, int mode)
> {
> - struct link_map *l = __dlopen (file, mode, RETURN_ADDRESS (0));
> - if (l != NULL)
> - {
> - __libc_register_dl_open_hook (l);
> - __libc_register_dlfcn_hook (l);
> - }
> - return l;
> + return __dlopen (file, mode, RETURN_ADDRESS (0));
> }
> weak_alias (___dlopen, dlopen)
> static_link_warning (dlopen)
Ok.
> diff --git a/dlfcn/dlopenold.c b/dlfcn/dlopenold.c
> index 0fe5f24cc5..9115501ac1 100644
> --- a/dlfcn/dlopenold.c
> +++ b/dlfcn/dlopenold.c
> @@ -71,7 +71,7 @@ __dlopen_nocheck (const char *file, int mode)
> args.mode = mode;
>
> 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;
> }
Ok.
> diff --git a/dlfcn/dlsym.c b/dlfcn/dlsym.c
> index 6b03b7b7ab..43044cf7bb 100644
> --- a/dlfcn/dlsym.c
> +++ b/dlfcn/dlsym.c
> @@ -63,7 +63,7 @@ void *
> ___dlsym (void *handle, const char *name)
> {
> if (!rtld_active ())
> - return _dlfcn_hook->dlsym (handle, name, RETURN_ADDRESS (0));
> + return GLRO (dl_dlfcn_hook)->dlsym (handle, name, RETURN_ADDRESS (0));
> else
> return dlsym_implementation (handle, name, RETURN_ADDRESS (0));
> }
Ok.
> diff --git a/dlfcn/dlvsym.c b/dlfcn/dlvsym.c
> index de6b340647..9b76f9afa5 100644
> --- a/dlfcn/dlvsym.c
> +++ b/dlfcn/dlvsym.c
> @@ -66,7 +66,8 @@ void *
> ___dlvsym (void *handle, const char *name, const char *version)
> {
> 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
> return dlvsym_implementation (handle, name, version, RETURN_ADDRESS (0));
> }
Ok.
> diff --git a/elf/Versions b/elf/Versions
> index be88c48e6d..a12d64e8db 100644
> --- a/elf/Versions
> +++ b/elf/Versions
> @@ -23,7 +23,6 @@ libc {
> GLIBC_PRIVATE {
> # functions used in other libraries
> _dl_addr;
> - _dl_open_hook; _dl_open_hook2;
> _dl_sym; _dl_vsym;
> __libc_dlclose; __libc_dlopen_mode; __libc_dlsym; __libc_dlvsym;
> __libc_early_init;
Ok.
> diff --git a/elf/dl-libc.c b/elf/dl-libc.c
> index ed551f6e56..3ac2a0645f 100644
> --- a/elf/dl-libc.c
> +++ b/elf/dl-libc.c
> @@ -126,32 +126,7 @@ do_dlclose (void *ptr)
> GLRO(dl_close) ((struct link_map *) ptr);
> }
>
> -/* This code is to support __libc_dlopen from __libc_dlopen'ed 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
> +#ifndef SHARED
> static void
> do_dlsym_private (void *ptr)
> {
> @@ -169,14 +144,6 @@ do_dlsym_private (void *ptr)
> args->map->l_scope, &vers, 0, 0, NULL);
> 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
>
> /* ... and these functions call dlerror_run. */
Ok.
> @@ -191,16 +158,9 @@ __libc_dlopen_mode (const char *name, int mode)
>
> #ifdef SHARED
> if (!rtld_active ())
> - return _dl_open_hook->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;
> + return GLRO (dl_dlfcn_hook)->libc_dlopen_mode (name, mode);
> #endif
> + return (dlerror_run (do_dlopen, &args) ? NULL : (void *) args.map);
I think you don not need the extra parentheses here.
> }
> libc_hidden_def (__libc_dlopen_mode)
>
Ok.
> @@ -216,21 +176,6 @@ __libc_dlsym_private (struct link_map *map, const char *name)
> return DL_SYMBOL_ADDRESS (sargs.loadbase, sargs.ref);
> 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
>
> void *
Ok.
> @@ -242,7 +187,7 @@ __libc_dlsym (void *map, const char *name)
>
> #ifdef SHARED
> if (!rtld_active ())
> - return _dl_open_hook->dlsym (map, name);
> + return GLRO (dl_dlfcn_hook)->libc_dlsym (map, name);
> #endif
> return (dlerror_run (do_dlsym, &args) ? NULL
> : (void *) (DL_SYMBOL_ADDRESS (args.loadbase, args.ref)));
> @@ -257,13 +202,7 @@ __libc_dlvsym (void *map, const char *name, const char *version)
> {
> #ifdef SHARED
> if (!rtld_active ())
> - {
> - /* 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);
> - }
> + return GLRO (dl_dlfcn_hook)->libc_dlvsym (map, name, version);
> #endif
>
> struct do_dlvsym_args args;
Ok.
> @@ -287,7 +226,7 @@ __libc_dlclose (void *map)
> {
> #ifdef SHARED
> if (!rtld_active ())
> - return _dl_open_hook->dlclose (map);
> + return GLRO (dl_dlfcn_hook)->libc_dlclose (map);
> #endif
> return dlerror_run (do_dlclose, map);
> }
Ok.
> diff --git a/elf/rtld_static_init.c b/elf/rtld_static_init.c
> index 42efecfbff..3f8abb6800 100644
> --- a/elf/rtld_static_init.c
> +++ b/elf/rtld_static_init.c
> @@ -25,6 +25,23 @@
>
> #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
> __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;
> dl->_dl_clktck = _dl_clktck;
> #endif
> + dl->_dl_dlfcn_hook = &_dlfcn_hook;
> extern __typeof (dl->_dl_hwcap) _dl_hwcap attribute_hidden;
> dl->_dl_hwcap = _dl_hwcap;
> extern __typeof (dl->_dl_hwcap2) _dl_hwcap2 attribute_hidden;
Ok.
> diff --git a/include/dlfcn.h b/include/dlfcn.h
> index 711bbb0f12..d4440c567e 100644
> --- a/include/dlfcn.h
> +++ b/include/dlfcn.h
> @@ -91,8 +91,12 @@ libc_hidden_proto (_dl_vsym)
> extern int _dlerror_run (void (*operate) (void *), void *args);
> 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
> {
> + /* Public interfaces. */
> void *(*dlopen) (const char *file, int mode, void *dl_caller);
> int (*dlclose) (void *handle);
> void *(*dlsym) (void *handle, const char *name, void *dl_caller);
> @@ -104,15 +108,17 @@ struct dlfcn_hook
> void **extra_info, int flags);
> int (*dlinfo) (void *handle, int request, void *arg);
> void *(*dlmopen) (Lmid_t nsid, const char *file, int mode, void *dl_caller);
> - void *pad[4];
> -};
>
> -extern struct dlfcn_hook *_dlfcn_hook;
> -libc_hidden_proto (_dlfcn_hook)
> + /* 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);
> +};
Ok.
>
> -/* 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. */
> +/* Note: These prototypes are for initializing _dlfcn_hook in static
> + builds; see __rtld_static_init. 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 *__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,
> void **extra_info, int flags);
> extern int __dlinfo (void *handle, int request, void *arg);
> -
> -#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
> +extern char *__dlerror (void);
>
> #endif
> #endif
Ok.
> diff --git a/sysdeps/generic/ldsodefs.h b/sysdeps/generic/ldsodefs.h
> index e383aa1dc3..176394de4d 100644
> --- a/sysdeps/generic/ldsodefs.h
> +++ b/sysdeps/generic/ldsodefs.h
> @@ -687,6 +687,9 @@ struct rtld_global_ro
> int (*_dl_discover_osversion) (void);
> #endif
>
> + /* Dynamic linker operations used after static dlopen. */
> + const struct dlfcn_hook *_dl_dlfcn_hook;
> +
> /* List of auditing interfaces. */
> struct audit_ifaces *_dl_audit;
> unsigned int _dl_naudit;
>
Ok.
prev parent reply other threads:[~2021-06-02 19:18 UTC|newest]
Thread overview: 39+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-05-31 14:10 [PATCH v3 00/16] Move libdl into libc Florian Weimer
2021-05-31 14:11 ` [PATCH v2 01/16] stdio-common: Remove _IO_vfwscanf Florian Weimer
2021-05-31 19:42 ` Adhemerval Zanella
2021-05-31 14:11 ` [PATCH 02/16] Add missing symbols to Version files Florian Weimer
2021-06-01 19:12 ` Adhemerval Zanella
2021-05-31 14:11 ` [PATCH 03/16] scripts/versions.awk: Add local: * to all version nodes Florian Weimer
2021-06-01 19:23 ` Adhemerval Zanella
2021-05-31 14:11 ` [PATCH v2 04/16] Add libc ABI extension kludge for baseline-violating libdl symbols Florian Weimer
2021-06-01 19:31 ` Adhemerval Zanella
2021-06-01 19:34 ` Florian Weimer
2021-06-01 19:38 ` Adhemerval Zanella
2021-05-31 14:11 ` [PATCH 05/16] dlfcn: Move dlerror into libc Florian Weimer
2021-06-01 19:36 ` Adhemerval Zanella
2021-05-31 14:11 ` [PATCH 06/16] dlfcn: Move dlclose " Florian Weimer
2021-06-02 12:58 ` Adhemerval Zanella
2021-05-31 14:11 ` [PATCH 07/16] dlfcn: Move dladdr " Florian Weimer
2021-06-02 14:02 ` Adhemerval Zanella
2021-05-31 14:11 ` [PATCH 08/16] dlfcn: Move dlsym " Florian Weimer
2021-06-02 14:12 ` Adhemerval Zanella
2021-05-31 14:12 ` [PATCH 09/16] dlfcn: Move dlmopen " Florian Weimer
2021-06-02 14:19 ` Adhemerval Zanella
2021-06-02 14:37 ` Florian Weimer
2021-06-02 14:43 ` Adhemerval Zanella
2021-06-02 17:49 ` Florian Weimer
2021-06-02 18:00 ` Adhemerval Zanella
2021-05-31 14:12 ` [PATCH 10/16] dlfcn: Move dladdr1 " Florian Weimer
2021-06-02 14:29 ` Adhemerval Zanella
2021-05-31 14:12 ` [PATCH 11/16] dlfcn: Move dlinfo " Florian Weimer
2021-06-02 14:31 ` Adhemerval Zanella
2021-05-31 14:12 ` [PATCH 12/16] dlfcn: Move dlvsym " Florian Weimer
2021-06-02 14:34 ` Adhemerval Zanella
2021-05-31 14:12 ` [PATCH 13/16] dlfcn: Move dlopen " Florian Weimer
2021-06-02 14:54 ` Adhemerval Zanella
2021-05-31 14:12 ` [PATCH 14/16] dlfcn: Cleanups after -ldl is no longer required Florian Weimer
2021-06-02 18:08 ` Adhemerval Zanella
2021-05-31 14:12 ` [PATCH v2 15/16] dlfcn: Eliminate GLIBC_PRIVATE dependency from tststatic2 Florian Weimer
2021-06-02 18:09 ` Adhemerval Zanella
2021-05-31 14:12 ` [PATCH 16/16] dlfcn: Rework static dlopen hooks Florian Weimer
2021-06-02 19:18 ` Adhemerval Zanella [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=da01049b-4d53-9165-a09d-b842bc9aea41@linaro.org \
--to=adhemerval.zanella@linaro.org \
--cc=fweimer@redhat.com \
--cc=libc-alpha@sourceware.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).