Skip to content

Commit 9c707c4

Browse files
DanShadersADKaster
authored andcommitted
Tests/LibELF: Run LibELF tests on Lagom using Linux runtime linker
So that we can be sure Serenity's runtime linker performs the same.
1 parent 6894faa commit 9c707c4

File tree

4 files changed

+66
-30
lines changed

4 files changed

+66
-30
lines changed

Meta/Lagom/CMakeLists.txt

+3
Original file line numberDiff line numberDiff line change
@@ -655,6 +655,9 @@ if (BUILD_LAGOM)
655655
list(APPEND TEST_DIRECTORIES LibWeb)
656656
list(APPEND TEST_DIRECTORIES LibWebView)
657657
endif()
658+
if (LINUX)
659+
list(APPEND TEST_DIRECTORIES LibELF)
660+
endif()
658661

659662
foreach (dir IN LISTS TEST_DIRECTORIES)
660663
add_serenity_subdirectory("Tests/${dir}")

Tests/LibELF/CMakeLists.txt

+59-26
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,29 @@
11
set(CMAKE_SKIP_RPATH FALSE)
2+
if (NOT BUILD_LAGOM)
3+
set(CMAKE_INSTALL_RPATH "$ORIGIN:$ORIGIN/../lib")
4+
set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE)
5+
else()
6+
set(CMAKE_BUILD_RPATH "$ORIGIN:$ORIGIN/../lib")
7+
set(CMAKE_INSTALL_RPATH "$ORIGIN:$ORIGIN/../lib")
8+
endif()
29

310
macro(add_test_lib NAME FILE)
411
add_library(${NAME} SHARED ${FILE})
5-
serenity_set_implicit_links(${NAME})
12+
if (NOT BUILD_LAGOM)
13+
serenity_set_implicit_links(${NAME})
14+
else()
15+
target_link_libraries(${NAME} PRIVATE AK LibCore)
16+
endif()
617
install(TARGETS ${NAME} DESTINATION usr/Tests/LibELF)
718
endmacro()
819

920
macro(add_test_exe NAME FILE)
1021
add_executable(${NAME} ${FILE})
11-
serenity_set_implicit_links(${NAME})
22+
if (NOT BUILD_LAGOM)
23+
serenity_set_implicit_links(${NAME})
24+
else()
25+
target_link_libraries(${NAME} PRIVATE AK LibCore)
26+
endif()
1227
install(TARGETS ${NAME} DESTINATION usr/Tests/LibELF)
1328
endmacro()
1429

@@ -19,53 +34,71 @@ macro(add_dlopen_lib NAME FUNCTION)
1934
target_link_libraries(${NAME} PRIVATE LibLine)
2035
endmacro()
2136

22-
add_dlopen_lib(DynlibA dynliba_function)
23-
add_dlopen_lib(DynlibB dynlibb_function)
24-
25-
add_dlopen_lib(DynlibC dynlibc_function)
26-
set(CMAKE_INSTALL_RPATH $ORIGIN)
27-
add_dlopen_lib(DynlibD dynlibd_function)
28-
target_link_libraries(DynlibD PRIVATE DynlibC)
29-
unset(CMAKE_INSTALL_RPATH)
37+
macro(target_link_manual TARGET LIB)
38+
target_link_libraries(${TARGET} PRIVATE -Wl,--push-state,--no-as-needed $<TARGET_FILE:${LIB}> -Wl,--pop-state)
39+
add_dependencies(${TARGET} ${LIB})
40+
endmacro()
3041

3142
set(TEST_SOURCES
32-
test-elf.cpp
3343
TestDlOpen.cpp
3444
TestOrder.cpp
3545
TestTLS.cpp
3646
TestWeakSymbolResolution.cpp
3747
)
3848

3949
foreach(source IN LISTS TEST_SOURCES)
40-
serenity_test("${source}" LibELF)
50+
if (NOT BUILD_LAGOM)
51+
serenity_test("${source}" LibELF)
52+
else()
53+
get_filename_component(test_name ${source} NAME_WE)
54+
lagom_test("${source}" WORKING_DIRECTORY "$<TARGET_FILE_DIR:${test_name}>")
55+
# FIXME: Figure out why on Ubuntu 22.04 dlopen ignores RUNPATH in executable.
56+
set_tests_properties(${test_name} PROPERTIES ENVIRONMENT LD_LIBRARY_PATH=${CMAKE_LIBRARY_OUTPUT_DIRECTORY})
57+
endif()
4158
endforeach()
4259

60+
# test-elf.cpp
61+
if (NOT BUILD_LAGOM)
62+
serenity_test(test-elf.cpp LibELF)
63+
endif()
64+
65+
# TestDlOpen.cpp
66+
add_dlopen_lib(DynlibA dynliba_function)
67+
add_dlopen_lib(DynlibB dynlibb_function)
68+
69+
add_dlopen_lib(DynlibC dynlibc_function)
70+
add_dlopen_lib(DynlibD dynlibd_function)
71+
target_link_manual(DynlibD DynlibC)
72+
73+
# TestTLS.cpp
4374
add_test_lib(TLSDef TLSDef.cpp)
4475
add_test_lib(TLSUse TLSUse.cpp)
4576
target_compile_options(TLSUse PRIVATE -ftls-model=global-dynamic)
4677
target_link_libraries(TLSUse PRIVATE LibCore LibTest LibThreading TLSDef)
47-
set_target_properties(TLSUse PROPERTIES INSTALL_RPATH "$ORIGIN")
4878
target_link_libraries(TestTLS PRIVATE TLSUse)
49-
set_target_properties(TestTLS PROPERTIES INSTALL_RPATH "$ORIGIN")
5079

80+
# TestWeakSymbolResolution.cpp
5181
add_test_lib(TestWeakSymbolResolution1 TestWeakSymbolResolution1.cpp)
5282
add_test_lib(TestWeakSymbolResolution2 TestWeakSymbolResolution2.cpp)
53-
target_link_libraries(TestWeakSymbolResolution PRIVATE TestWeakSymbolResolution1 TestWeakSymbolResolution2)
54-
set_target_properties(TestWeakSymbolResolution PROPERTIES INSTALL_RPATH "$ORIGIN")
83+
target_link_manual(TestWeakSymbolResolution TestWeakSymbolResolution1)
84+
target_link_manual(TestWeakSymbolResolution TestWeakSymbolResolution2)
5585

86+
# TestOrder.cpp
5687
add_test_lib(TestOrderLib1 TestOrderLib1.cpp)
5788
add_test_lib(TestOrderLib2 TestOrderLib2.cpp)
58-
target_link_libraries(TestOrderLib2 PRIVATE TestOrderLib1)
59-
set_target_properties(TestOrderLib2 PROPERTIES INSTALL_RPATH "$ORIGIN")
89+
target_link_manual(TestOrderLib2 TestOrderLib1)
6090

61-
# NOTE: This is so ugly because CMake sorts targets supplied to target_link_libraries.
62-
# .elf extension here avoids direct invocations by SerenityOS's test runner.
6391
add_test_exe(TestOrderExe1.elf TestOrderExe.cpp)
64-
target_link_libraries(TestOrderExe1.elf PRIVATE $<TARGET_FILE:TestOrderLib1> $<TARGET_FILE:TestOrderLib2>)
65-
add_dependencies(TestOrderExe1.elf TestOrderLib1 TestOrderLib2)
66-
set_target_properties(TestOrderExe1.elf PROPERTIES INSTALL_RPATH "$ORIGIN")
92+
target_link_manual(TestOrderExe1.elf TestOrderLib1)
93+
target_link_manual(TestOrderExe1.elf TestOrderLib2)
6794

6895
add_test_exe(TestOrderExe2.elf TestOrderExe.cpp)
69-
target_link_libraries(TestOrderExe2.elf PRIVATE $<TARGET_FILE:TestOrderLib2> $<TARGET_FILE:TestOrderLib1>)
70-
add_dependencies(TestOrderExe2.elf TestOrderLib1 TestOrderLib2)
71-
set_target_properties(TestOrderExe2.elf PROPERTIES INSTALL_RPATH "$ORIGIN")
96+
target_link_manual(TestOrderExe2.elf TestOrderLib2)
97+
target_link_manual(TestOrderExe2.elf TestOrderLib1)
98+
99+
add_dependencies(TestOrder
100+
TestOrderLib1
101+
TestOrderLib2
102+
TestOrderExe1.elf
103+
TestOrderExe2.elf
104+
)

Tests/LibELF/TestDlOpen.cpp

+3-3
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,9 @@
99

1010
TEST_CASE(test_dlopen)
1111
{
12-
auto liba = dlopen("/usr/Tests/LibELF/libDynlibA.so", 0);
12+
auto liba = dlopen("libDynlibA.so", RTLD_LAZY | RTLD_GLOBAL);
1313
EXPECT_NE(liba, nullptr);
14-
auto libb = dlopen("/usr/Tests/LibELF/libDynlibB.so", 0);
14+
auto libb = dlopen("libDynlibB.so", RTLD_LAZY | RTLD_GLOBAL);
1515
EXPECT_NE(libb, nullptr);
1616

1717
typedef int (*dynlib_func_t)();
@@ -26,7 +26,7 @@ TEST_CASE(test_dlopen)
2626

2727
TEST_CASE(test_dlsym_rtld_default)
2828
{
29-
auto libd = dlopen("/usr/Tests/LibELF/libDynlibD.so", 0);
29+
auto libd = dlopen("libDynlibD.so", RTLD_LAZY | RTLD_GLOBAL);
3030
EXPECT_NE(libd, nullptr);
3131
if (libd == nullptr) {
3232
warnln("can't open libDynlibD.so, {}", dlerror());

Tests/LibELF/TestTLS.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ TEST_CASE(basic)
1717

1818
TEST_CASE(local_exec)
1919
{
20-
[[gnu::tls_model("local-exec")]] static volatile __thread char test1[PAGE_SIZE * 4 + 10];
20+
[[gnu::tls_model("local-exec")]] static volatile __thread char test1[4096 * 4 + 10];
2121

2222
for (size_t i = 0; i < sizeof(test1); i++) {
2323
test1[i] = static_cast<char>(i);

0 commit comments

Comments
 (0)