From d72bf085a66fb55d3d0a615ae01ab2c52786099e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kacper=20S=C5=82omi=C5=84ski?= Date: Fri, 27 Dec 2024 03:45:21 +0100 Subject: [PATCH] posix,rtld: Make use of version in dlvsym --- options/posix/generic/dlfcn.cpp | 7 +++---- options/rtld/generic/main.cpp | 5 ++++- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/options/posix/generic/dlfcn.cpp b/options/posix/generic/dlfcn.cpp index fc34a3b985..91e855ba4e 100644 --- a/options/posix/generic/dlfcn.cpp +++ b/options/posix/generic/dlfcn.cpp @@ -15,7 +15,7 @@ struct __dlapi_symbol { extern "C" const char *__dlapi_error(); extern "C" void *__dlapi_open(const char *, int, void *); -extern "C" void *__dlapi_resolve(void *, const char *, void *); +extern "C" void *__dlapi_resolve(void *, const char *, void *, const char *); extern "C" int __dlapi_reverse(const void *, __dlapi_symbol *); extern "C" int __dlapi_close(void *); @@ -36,14 +36,13 @@ void *dlopen(const char *file, int flags) { [[gnu::noinline]] void *dlsym(void *__restrict handle, const char *__restrict string) { auto ra = __builtin_extract_return_addr(__builtin_return_address(0)); - return __dlapi_resolve(handle, string, ra); + return __dlapi_resolve(handle, string, ra, NULL); } [[gnu::noinline]] void *dlvsym(void *__restrict handle, const char *__restrict string, const char *__restrict version) { - mlibc::infoLogger() << "mlibc: dlvsym ignores version " << version << frg::endlog; auto ra = __builtin_extract_return_addr(__builtin_return_address(0)); - return __dlapi_resolve(handle, string, ra); + return __dlapi_resolve(handle, string, ra, version); } //gnu extensions diff --git a/options/rtld/generic/main.cpp b/options/rtld/generic/main.cpp index 7460f9bf3c..48138174fc 100644 --- a/options/rtld/generic/main.cpp +++ b/options/rtld/generic/main.cpp @@ -666,7 +666,7 @@ void *__dlapi_open(const char *file, int flags, void *returnAddress) { } extern "C" [[ gnu::visibility("default") ]] -void *__dlapi_resolve(void *handle, const char *string, void *returnAddress) { +void *__dlapi_resolve(void *handle, const char *string, void *returnAddress, const char *version) { if (logDlCalls) { const char *name; bool quote = false; @@ -686,6 +686,9 @@ void *__dlapi_resolve(void *handle, const char *string, void *returnAddress) { frg::optional target; frg::optional targetVersion = frg::null_opt; + if(version) + targetVersion = SymbolVersion{version}; + if (handle == RTLD_DEFAULT) { target = globalScope->resolveSymbol(string, 0, 0, targetVersion); } else if (handle == RTLD_NEXT) {