mirror of
https://github.com/RGBCube/serenity
synced 2025-05-15 09:44:58 +00:00
Tests: Add test for dlsym(RTLD_DEFAULT) for symbols from dlopen'd libs
This broke with recent changes to library loading and mapping order.
This commit is contained in:
parent
6732fec8b8
commit
a0eb0a275d
2 changed files with 29 additions and 1 deletions
|
@ -1,3 +1,4 @@
|
||||||
|
set(CMAKE_SKIP_RPATH FALSE)
|
||||||
macro(add_dlopen_lib NAME FUNCTION)
|
macro(add_dlopen_lib NAME FUNCTION)
|
||||||
add_library(${NAME} SHARED Dynlib.cpp)
|
add_library(${NAME} SHARED Dynlib.cpp)
|
||||||
target_compile_definitions(${NAME} PRIVATE -DFUNCTION=${FUNCTION})
|
target_compile_definitions(${NAME} PRIVATE -DFUNCTION=${FUNCTION})
|
||||||
|
@ -6,11 +7,17 @@ macro(add_dlopen_lib NAME FUNCTION)
|
||||||
# Avoid execution by the test runner
|
# Avoid execution by the test runner
|
||||||
install(TARGETS ${NAME}
|
install(TARGETS ${NAME}
|
||||||
DESTINATION usr/Tests/LibELF
|
DESTINATION usr/Tests/LibELF
|
||||||
PERMISSIONS OWNER_READ GROUP_READ WORLD_READ)
|
PERMISSIONS OWNER_READ GROUP_READ WORLD_READ OWNER_WRITE GROUP_WRITE)
|
||||||
endmacro()
|
endmacro()
|
||||||
add_dlopen_lib(DynlibA dynliba_function)
|
add_dlopen_lib(DynlibA dynliba_function)
|
||||||
add_dlopen_lib(DynlibB dynlibb_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
|
set(TEST_SOURCES
|
||||||
test-elf.cpp
|
test-elf.cpp
|
||||||
TestDlOpen.cpp
|
TestDlOpen.cpp
|
||||||
|
|
|
@ -23,3 +23,24 @@ TEST_CASE(test_dlopen)
|
||||||
EXPECT_NE(func_b, nullptr);
|
EXPECT_NE(func_b, nullptr);
|
||||||
EXPECT_EQ(0, func_b());
|
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);
|
||||||
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue