From a0eb0a275db2aab1719172f8b7e16c661ec4bd0c Mon Sep 17 00:00:00 2001 From: Andrew Kaster Date: Fri, 24 Jun 2022 01:59:34 -0600 Subject: [PATCH] Tests: Add test for dlsym(RTLD_DEFAULT) for symbols from dlopen'd libs This broke with recent changes to library loading and mapping order. --- Tests/LibELF/CMakeLists.txt | 9 ++++++++- Tests/LibELF/TestDlOpen.cpp | 21 +++++++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/Tests/LibELF/CMakeLists.txt b/Tests/LibELF/CMakeLists.txt index 5e5303be1d..cfb00be94a 100644 --- a/Tests/LibELF/CMakeLists.txt +++ b/Tests/LibELF/CMakeLists.txt @@ -1,3 +1,4 @@ +set(CMAKE_SKIP_RPATH FALSE) macro(add_dlopen_lib NAME FUNCTION) add_library(${NAME} SHARED Dynlib.cpp) target_compile_definitions(${NAME} PRIVATE -DFUNCTION=${FUNCTION}) @@ -6,11 +7,17 @@ macro(add_dlopen_lib NAME FUNCTION) # Avoid execution by the test runner install(TARGETS ${NAME} DESTINATION usr/Tests/LibELF - PERMISSIONS OWNER_READ GROUP_READ WORLD_READ) + PERMISSIONS OWNER_READ GROUP_READ WORLD_READ OWNER_WRITE GROUP_WRITE) endmacro() add_dlopen_lib(DynlibA dynliba_function) add_dlopen_lib(DynlibB dynlibb_function) +add_dlopen_lib(DynlibC dynlibc_function) +set(CMAKE_INSTALL_RPATH $ORIGIN) +add_dlopen_lib(DynlibD dynlibd_function) +target_link_libraries(DynlibD DynlibC) +unset(CMAKE_INSTALL_RPATH) + set(TEST_SOURCES test-elf.cpp TestDlOpen.cpp diff --git a/Tests/LibELF/TestDlOpen.cpp b/Tests/LibELF/TestDlOpen.cpp index 92f69a051e..ee78afb4bf 100644 --- a/Tests/LibELF/TestDlOpen.cpp +++ b/Tests/LibELF/TestDlOpen.cpp @@ -23,3 +23,24 @@ TEST_CASE(test_dlopen) EXPECT_NE(func_b, nullptr); EXPECT_EQ(0, func_b()); } + +TEST_CASE(test_dlsym_rtld_default) +{ + auto libd = dlopen("/usr/Tests/LibELF/libDynlibD.so", 0); + EXPECT_NE(libd, nullptr); + if (libd == nullptr) { + warnln("can't open libDynlibD.so, {}", dlerror()); + return; + } + + typedef int (*dynlib_func_t)(); + dynlib_func_t func_c = (dynlib_func_t)dlsym(RTLD_DEFAULT, "dynlibc_function"); + EXPECT_NE(func_c, nullptr); + EXPECT_EQ(0, func_c()); + + dynlib_func_t func_d = (dynlib_func_t)dlsym(RTLD_DEFAULT, "dynlibd_function"); + EXPECT_NE(func_d, nullptr); + EXPECT_EQ(0, func_d()); + + dlclose(libd); +}