mirror of
https://github.com/RGBCube/serenity
synced 2025-07-28 19:57:36 +00:00
Tests/LibELF: Test loading libraries with dynamic TLS
The setup is a bit peculiar: both the definition and the use site of these TLS variables have to be in a shared library, otherwise the linker might relax the global-dynamic access mode to something that doesn't require a `__tls_get_addr` call.
This commit is contained in:
parent
ad9e674fa0
commit
c63fe0e1f1
4 changed files with 106 additions and 6 deletions
|
@ -1,15 +1,21 @@
|
|||
set(CMAKE_SKIP_RPATH FALSE)
|
||||
macro(add_dlopen_lib NAME FUNCTION)
|
||||
add_library(${NAME} SHARED Dynlib.cpp)
|
||||
target_compile_definitions(${NAME} PRIVATE -DFUNCTION=${FUNCTION})
|
||||
# LibLine is not special, just an "external" dependency
|
||||
target_link_libraries(${NAME} PRIVATE LibLine)
|
||||
|
||||
macro(add_test_lib NAME FILE)
|
||||
add_library(${NAME} SHARED ${FILE})
|
||||
serenity_set_implicit_links(${NAME})
|
||||
# Avoid execution by the test runner
|
||||
# Avoid execution by the test runner
|
||||
install(TARGETS ${NAME}
|
||||
DESTINATION usr/Tests/LibELF
|
||||
PERMISSIONS OWNER_READ GROUP_READ WORLD_READ OWNER_WRITE GROUP_WRITE)
|
||||
endmacro()
|
||||
|
||||
macro(add_dlopen_lib NAME FUNCTION)
|
||||
add_test_lib(${NAME} Dynlib.cpp)
|
||||
target_compile_definitions(${NAME} PRIVATE -DFUNCTION=${FUNCTION})
|
||||
# LibLine is not special, just an "external" dependency
|
||||
target_link_libraries(${NAME} PRIVATE LibLine)
|
||||
endmacro()
|
||||
|
||||
add_dlopen_lib(DynlibA dynliba_function)
|
||||
add_dlopen_lib(DynlibB dynlibb_function)
|
||||
|
||||
|
@ -22,8 +28,17 @@ unset(CMAKE_INSTALL_RPATH)
|
|||
set(TEST_SOURCES
|
||||
test-elf.cpp
|
||||
TestDlOpen.cpp
|
||||
TestTLS.cpp
|
||||
)
|
||||
|
||||
foreach(source IN LISTS TEST_SOURCES)
|
||||
serenity_test("${source}" LibELF)
|
||||
endforeach()
|
||||
|
||||
add_test_lib(TLSDef TLSDef.cpp)
|
||||
add_test_lib(TLSUse TLSUse.cpp)
|
||||
target_compile_options(TLSUse PRIVATE -ftls-model=global-dynamic)
|
||||
target_link_libraries(TLSUse PRIVATE LibCore LibTest LibThreading TLSDef)
|
||||
set_target_properties(TLSUse PROPERTIES INSTALL_RPATH "$ORIGIN")
|
||||
target_link_libraries(TestTLS PRIVATE TLSUse)
|
||||
set_target_properties(TestTLS PROPERTIES INSTALL_RPATH "$ORIGIN")
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue