diff --git a/Toolchain/Stubs/i686clang/libc.so b/Toolchain/Stubs/i686clang/libc.so index bf87ceff55..fe90dfc0f2 100644 Binary files a/Toolchain/Stubs/i686clang/libc.so and b/Toolchain/Stubs/i686clang/libc.so differ diff --git a/Toolchain/Stubs/i686clang/libdl.so b/Toolchain/Stubs/i686clang/libdl.so deleted file mode 100644 index ab3b2af601..0000000000 Binary files a/Toolchain/Stubs/i686clang/libdl.so and /dev/null differ diff --git a/Toolchain/Stubs/x86_64clang/libc.so b/Toolchain/Stubs/x86_64clang/libc.so index f4ae65b5ee..14cd6f94d9 100644 Binary files a/Toolchain/Stubs/x86_64clang/libc.so and b/Toolchain/Stubs/x86_64clang/libc.so differ diff --git a/Toolchain/Stubs/x86_64clang/libdl.so b/Toolchain/Stubs/x86_64clang/libdl.so deleted file mode 100644 index 18638c1063..0000000000 Binary files a/Toolchain/Stubs/x86_64clang/libdl.so and /dev/null differ diff --git a/Userland/Libraries/LibC/dlfcn.cpp b/Userland/Libraries/LibC/dlfcn.cpp index df611300e1..d27b1074cd 100644 --- a/Userland/Libraries/LibC/dlfcn.cpp +++ b/Userland/Libraries/LibC/dlfcn.cpp @@ -4,10 +4,82 @@ * SPDX-License-Identifier: BSD-2-Clause */ +#include +#include +#include #include +#include -// These are used by libdl and are filled in by the dynamic loader. +// These are filled in by the dynamic loader. DlCloseFunction __dlclose; DlOpenFunction __dlopen; DlSymFunction __dlsym; DlAddrFunction __dladdr; + +// FIXME: use thread_local and a String once TLS works +#ifdef NO_TLS +char* s_dlerror_text = NULL; +bool s_dlerror_retrieved = false; +#else +__thread char* s_dlerror_text = NULL; +__thread bool s_dlerror_retrieved = false; +#endif + +static void store_error(String const& error) +{ + free(s_dlerror_text); + s_dlerror_text = strdup(error.characters()); + s_dlerror_retrieved = false; +} + +int dlclose(void* handle) +{ + auto result = __dlclose(handle); + if (result.is_error()) { + store_error(result.error().text); + return -1; + } + return 0; +} + +char* dlerror() +{ + if (s_dlerror_retrieved) { + free(s_dlerror_text); + s_dlerror_text = nullptr; + } + s_dlerror_retrieved = true; + return const_cast(s_dlerror_text); +} + +void* dlopen(char const* filename, int flags) +{ + auto result = __dlopen(filename, flags); + if (result.is_error()) { + store_error(result.error().text); + return nullptr; + } + return result.value(); +} + +void* dlsym(void* handle, char const* symbol_name) +{ + auto result = __dlsym(handle, symbol_name); + if (result.is_error()) { + store_error(result.error().text); + return nullptr; + } + return result.value(); +} + +int dladdr(void* addr, Dl_info* info) +{ + auto result = __dladdr(addr, info); + if (result.is_error()) { + // FIXME: According to the man page glibc does _not_ make the error + // available via dlerror(), however we do. Does this break anything? + store_error(result.error().text); + return 0; + } + return 1; +} diff --git a/Userland/Libraries/LibDl/dlfcn.h b/Userland/Libraries/LibC/dlfcn.h similarity index 100% rename from Userland/Libraries/LibDl/dlfcn.h rename to Userland/Libraries/LibC/dlfcn.h diff --git a/Userland/Libraries/LibDl/dlfcn_integration.h b/Userland/Libraries/LibC/dlfcn_integration.h similarity index 100% rename from Userland/Libraries/LibDl/dlfcn_integration.h rename to Userland/Libraries/LibC/dlfcn_integration.h diff --git a/Userland/Libraries/LibDl/CMakeLists.txt b/Userland/Libraries/LibDl/CMakeLists.txt index 16199b9388..b86c5f768e 100644 --- a/Userland/Libraries/LibDl/CMakeLists.txt +++ b/Userland/Libraries/LibDl/CMakeLists.txt @@ -1,6 +1,4 @@ -set(SOURCES - dlfcn.cpp -) - -serenity_libc(LibDl dl) -target_link_libraries(LibDl LibC) +# Provide a dummy target and a linker script that tells everything to link against LibC instead. +add_library(LibDl INTERFACE) +target_link_libraries(LibDl INTERFACE LibC) +file(WRITE "${CMAKE_STAGING_PREFIX}/${CMAKE_INSTALL_LIBDIR}/libdl.so" "INPUT(libc.so)") diff --git a/Userland/Libraries/LibDl/dlfcn.cpp b/Userland/Libraries/LibDl/dlfcn.cpp deleted file mode 100644 index 076d0e17ec..0000000000 --- a/Userland/Libraries/LibDl/dlfcn.cpp +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Copyright (c) 2021, Gunnar Beutner - * - * SPDX-License-Identifier: BSD-2-Clause - */ - -#include -#include -#include -#include -#include - -// FIXME: use thread_local and a String once TLS works -__thread char* s_dlerror_text = NULL; -__thread bool s_dlerror_retrieved = false; - -static void store_error(String const& error) -{ - free(s_dlerror_text); - s_dlerror_text = strdup(error.characters()); - s_dlerror_retrieved = false; -} - -int dlclose(void* handle) -{ - auto result = __dlclose(handle); - if (result.is_error()) { - store_error(result.error().text); - return -1; - } - return 0; -} - -char* dlerror() -{ - if (s_dlerror_retrieved) { - free(s_dlerror_text); - s_dlerror_text = nullptr; - } - s_dlerror_retrieved = true; - return const_cast(s_dlerror_text); -} - -void* dlopen(char const* filename, int flags) -{ - auto result = __dlopen(filename, flags); - if (result.is_error()) { - store_error(result.error().text); - return nullptr; - } - return result.value(); -} - -void* dlsym(void* handle, char const* symbol_name) -{ - auto result = __dlsym(handle, symbol_name); - if (result.is_error()) { - store_error(result.error().text); - return nullptr; - } - return result.value(); -} - -int dladdr(void* addr, Dl_info* info) -{ - auto result = __dladdr(addr, info); - if (result.is_error()) { - // FIXME: According to the man page glibc does _not_ make the error - // available via dlerror(), however we do. Does this break anything? - store_error(result.error().text); - return 0; - } - return 1; -}