diff options
author | Florian Weimer <fweimer@redhat.com> | 2021-06-02 07:32:20 +0200 |
---|---|---|
committer | Florian Weimer <fweimer@redhat.com> | 2021-06-02 09:06:10 +0200 |
commit | a23c28ec0d1cd67d25972181f613ef6dbfe4e299 (patch) | |
tree | a6dd4e7c1a2ebb65af836b87e8b441ae6ece357a /dlfcn/dlerror.c | |
parent | c44838ebf8b8da0795d56e05b477c5d2b37b4a19 (diff) | |
download | glibc-a23c28ec0d1cd67d25972181f613ef6dbfe4e299.tar glibc-a23c28ec0d1cd67d25972181f613ef6dbfe4e299.tar.gz glibc-a23c28ec0d1cd67d25972181f613ef6dbfe4e299.tar.bz2 glibc-a23c28ec0d1cd67d25972181f613ef6dbfe4e299.zip |
dlfcn: Move dlerror into libc
The symbol was moved using scripts/move-symbol-to-libc.py.
There is a minor functionality enhancement: dlerror now sets
errno if it was set as part of the exception. (This is the result
of using %m in asprintf, to avoid the strerror PLT call.) The
previous errno value upon function return was unpredictable.
Documenting this as a feature is premature; we need to make sure
that the error codes are meaningful when they are set by the dynamic
loader.
Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
Diffstat (limited to 'dlfcn/dlerror.c')
-rw-r--r-- | dlfcn/dlerror.c | 43 |
1 files changed, 19 insertions, 24 deletions
diff --git a/dlfcn/dlerror.c b/dlfcn/dlerror.c index 7db70a26d0..3df8602f4d 100644 --- a/dlfcn/dlerror.c +++ b/dlfcn/dlerror.c @@ -28,16 +28,6 @@ #include <assert.h> #include <dlerror.h> -#if !defined SHARED && IS_IN (libdl) - -char * -dlerror (void) -{ - return __dlerror (); -} - -#else - char * __dlerror (void) { @@ -86,11 +76,15 @@ __dlerror (void) result->objname[0] == '\0' ? "" : ": ", _(result->errstring)); else - n = __asprintf (&buf, "%s%s%s: %s", - result->objname, - result->objname[0] == '\0' ? "" : ": ", - _(result->errstring), - strerror (result->errcode)); + { + __set_errno (result->errcode); + n = __asprintf (&buf, "%s%s%s: %m", + result->objname, + result->objname[0] == '\0' ? "" : ": ", + _(result->errstring)); + /* Set errno again in case asprintf clobbered it. */ + __set_errno (result->errcode); + } /* Mark the error as delivered. */ result->returned = true; @@ -108,9 +102,11 @@ __dlerror (void) existing string as a fallback. */ return result->errstring; } -# ifdef SHARED -strong_alias (__dlerror, dlerror) -# endif +versioned_symbol (libc, __dlerror, dlerror, GLIBC_2_34); + +#if OTHER_SHLIB_COMPAT (libdl, GLIBC_2_0, GLIBC_2_34) +compat_symbol (libdl, __dlerror, dlerror, GLIBC_2_0); +#endif int _dlerror_run (void (*operate) (void *), void *args) @@ -200,13 +196,13 @@ _dlerror_run (void (*operate) (void *), void *args) return 1; } } +libc_hidden_def (_dlerror_run) -# ifdef SHARED - +#ifdef SHARED struct dlfcn_hook *_dlfcn_hook __attribute__((nocommon)); -libdl_hidden_data_def (_dlfcn_hook) +libc_hidden_data_def (_dlfcn_hook) -# else +#else /* !SHARED */ static struct dlfcn_hook _dlfcn_hooks = { @@ -230,5 +226,4 @@ __libc_register_dlfcn_hook (struct link_map *map) if (hook != NULL) *hook = &_dlfcn_hooks; } -# endif -#endif +#endif /* !SHARED */ |