diff options
author | Florian Weimer <fweimer@redhat.com> | 2021-06-03 08:26:04 +0200 |
---|---|---|
committer | Florian Weimer <fweimer@redhat.com> | 2021-06-03 09:12:05 +0200 |
commit | 466c1ea15f461edb8e3ffaf5d86d708876343bbf (patch) | |
tree | 43d42d322ff24bd12c4124a9edafc4e0e4232f0a /dlfcn/dlerror.c | |
parent | 9c76debc983e1a16e2e723b36526826713a671af (diff) | |
download | glibc-466c1ea15f461edb8e3ffaf5d86d708876343bbf.tar.gz glibc-466c1ea15f461edb8e3ffaf5d86d708876343bbf.tar.xz glibc-466c1ea15f461edb8e3ffaf5d86d708876343bbf.zip |
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>
Diffstat (limited to 'dlfcn/dlerror.c')
-rw-r--r-- | dlfcn/dlerror.c | 32 |
1 files changed, 1 insertions, 31 deletions
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 */ |