Symbol visibility tests
This commit is contained in:
@@ -28,7 +28,7 @@ if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
|
|||||||
endif()
|
endif()
|
||||||
|
|
||||||
add_compile_options(-fdata-sections -ffunction-sections -Wswitch-enum
|
add_compile_options(-fdata-sections -ffunction-sections -Wswitch-enum
|
||||||
-Werror=switch-enum -fPIC)
|
-Werror=switch-enum -fvisibility=hidden -fPIC)
|
||||||
|
|
||||||
set(full_relro_flags "-pie;LINKER:-z,relro,-z,now,-z,noexecstack")
|
set(full_relro_flags "-pie;LINKER:-z,relro,-z,now,-z,noexecstack")
|
||||||
cmake_push_check_state()
|
cmake_push_check_state()
|
||||||
@@ -60,7 +60,8 @@ set(CMAKE_CXX_IMPLICIT_LINK_LIBRARIES "")
|
|||||||
|
|
||||||
add_subdirectory(third_party)
|
add_subdirectory(third_party)
|
||||||
|
|
||||||
add_executable(versioned_map_main VersionedMap.cpp RootSet.cpp)
|
add_executable(versioned_map_main VersionedMap.cpp RootSet.cpp
|
||||||
|
$<TARGET_OBJECTS:xxhash>)
|
||||||
target_include_directories(versioned_map_main
|
target_include_directories(versioned_map_main
|
||||||
PRIVATE ${CMAKE_SOURCE_DIR}/include)
|
PRIVATE ${CMAKE_SOURCE_DIR}/include)
|
||||||
target_link_libraries(versioned_map_main PRIVATE nanobench xxhash)
|
target_link_libraries(versioned_map_main PRIVATE nanobench xxhash)
|
||||||
@@ -71,11 +72,48 @@ if(CMAKE_BUILD_TYPE STREQUAL "Debug")
|
|||||||
target_link_options(versioned_map_main PRIVATE -fsanitize=address,undefined)
|
target_link_options(versioned_map_main PRIVATE -fsanitize=address,undefined)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
add_library(versioned_map VersionedMap.cpp RootSet.cpp)
|
add_library(${PROJECT_NAME}-object OBJECT VersionedMap.cpp RootSet.cpp)
|
||||||
target_link_libraries(versioned_map PRIVATE xxhash)
|
|
||||||
target_compile_options(versioned_map PRIVATE -fno-exceptions)
|
target_compile_options(${PROJECT_NAME}-object PRIVATE -fno-exceptions -fno-rtti)
|
||||||
target_include_directories(versioned_map PUBLIC ${CMAKE_SOURCE_DIR}/include)
|
target_include_directories(${PROJECT_NAME}-object
|
||||||
set_target_properties(versioned_map PROPERTIES LINKER_LANGUAGE C)
|
PRIVATE ${CMAKE_SOURCE_DIR}/include)
|
||||||
|
target_link_libraries(${PROJECT_NAME}-object PRIVATE xxhash)
|
||||||
|
|
||||||
|
add_custom_command(
|
||||||
|
OUTPUT ${CMAKE_BINARY_DIR}/${PROJECT_NAME}.o
|
||||||
|
COMMAND ld -r $<TARGET_OBJECTS:${PROJECT_NAME}-object>
|
||||||
|
$<TARGET_OBJECTS:xxhash> -o ${CMAKE_BINARY_DIR}/${PROJECT_NAME}.o
|
||||||
|
DEPENDS $<TARGET_OBJECTS:${PROJECT_NAME}-object> $<TARGET_OBJECTS:xxhash>
|
||||||
|
COMMAND_EXPAND_LISTS)
|
||||||
|
|
||||||
|
add_library(${PROJECT_NAME} SHARED ${CMAKE_BINARY_DIR}/${PROJECT_NAME}.o)
|
||||||
|
set_target_properties(
|
||||||
|
${PROJECT_NAME} PROPERTIES LIBRARY_OUTPUT_DIRECTORY
|
||||||
|
"${CMAKE_BINARY_DIR}/versioned-map")
|
||||||
|
if(NOT CMAKE_BUILD_TYPE STREQUAL Debug)
|
||||||
|
set_target_properties(${PROJECT_NAME} PROPERTIES LINKER_LANGUAGE C)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(HAS_VERSION_SCRIPT)
|
||||||
|
target_link_options(${PROJECT_NAME} PRIVATE
|
||||||
|
LINKER:--version-script=${CMAKE_SOURCE_DIR}/linker.map)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
add_library(${PROJECT_NAME}-static STATIC ${CMAKE_BINARY_DIR}/${PROJECT_NAME}.o)
|
||||||
|
if(NOT CMAKE_BUILD_TYPE STREQUAL Debug)
|
||||||
|
set_target_properties(${PROJECT_NAME}-static PROPERTIES LINKER_LANGUAGE C)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(NOT APPLE)
|
||||||
|
add_custom_command(
|
||||||
|
TARGET ${PROJECT_NAME}-static
|
||||||
|
POST_BUILD
|
||||||
|
COMMAND
|
||||||
|
${CMAKE_OBJCOPY}
|
||||||
|
--keep-global-symbols=${CMAKE_SOURCE_DIR}/symbol-exports.txt
|
||||||
|
$<TARGET_FILE:${PROJECT_NAME}-static> || echo
|
||||||
|
"Proceeding with all symbols global in static library")
|
||||||
|
endif()
|
||||||
|
|
||||||
include(CTest)
|
include(CTest)
|
||||||
|
|
||||||
@@ -101,4 +139,30 @@ if(BUILD_TESTING)
|
|||||||
target_compile_options(rootset_test_tsan PRIVATE -fsanitize=thread -UNDEBUG)
|
target_compile_options(rootset_test_tsan PRIVATE -fsanitize=thread -UNDEBUG)
|
||||||
target_link_options(rootset_test_tsan PRIVATE -fsanitize=thread)
|
target_link_options(rootset_test_tsan PRIVATE -fsanitize=thread)
|
||||||
add_test(NAME rootset_test_tsan COMMAND rootset_test)
|
add_test(NAME rootset_test_tsan COMMAND rootset_test)
|
||||||
|
|
||||||
|
# symbol visibility tests
|
||||||
|
if(NOT CMAKE_BUILD_TYPE STREQUAL Debug)
|
||||||
|
if(APPLE)
|
||||||
|
set(symbol_exports ${CMAKE_SOURCE_DIR}/apple-symbol-exports.txt)
|
||||||
|
set(symbol_imports ${CMAKE_SOURCE_DIR}/apple-symbol-imports.txt)
|
||||||
|
else()
|
||||||
|
set(symbol_exports ${CMAKE_SOURCE_DIR}/symbol-exports.txt)
|
||||||
|
if(CMAKE_SYSTEM_PROCESSOR STREQUAL aarch64)
|
||||||
|
set(symbol_imports ${CMAKE_SOURCE_DIR}/aarch64-symbol-imports.txt)
|
||||||
|
else()
|
||||||
|
set(symbol_imports ${CMAKE_SOURCE_DIR}/symbol-imports.txt)
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
add_test(
|
||||||
|
NAME shared_symbols
|
||||||
|
COMMAND
|
||||||
|
${CMAKE_SOURCE_DIR}/test_symbols.sh $<TARGET_FILE:${PROJECT_NAME}>
|
||||||
|
${symbol_exports} ${symbol_imports})
|
||||||
|
add_test(
|
||||||
|
NAME static_symbols
|
||||||
|
COMMAND
|
||||||
|
${CMAKE_SOURCE_DIR}/test_symbols.sh
|
||||||
|
$<TARGET_FILE:${PROJECT_NAME}-static> ${symbol_exports}
|
||||||
|
${symbol_imports})
|
||||||
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
@@ -460,7 +460,7 @@ private:
|
|||||||
int searchPathSize_;
|
int searchPathSize_;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct VersionedMap::Impl {
|
struct __attribute__((__visibility__("hidden"))) VersionedMap::Impl {
|
||||||
|
|
||||||
// The last node is allowed to be 0, in which case this is the search path of
|
// The last node is allowed to be 0, in which case this is the search path of
|
||||||
// where an entry would exist
|
// where an entry would exist
|
||||||
@@ -1174,13 +1174,13 @@ int64_t VersionedMap::getBytes() const { return impl->getBytes(); }
|
|||||||
|
|
||||||
// GCOVR_EXCL_START
|
// GCOVR_EXCL_START
|
||||||
|
|
||||||
void VersionedMap::Impl::printInOrder(int64_t version) {
|
inline void VersionedMap::Impl::printInOrder(int64_t version) {
|
||||||
printInOrderHelper(version,
|
printInOrderHelper(version,
|
||||||
roots.getThreadSafeHandle().rootForVersion(version), 0);
|
roots.getThreadSafeHandle().rootForVersion(version), 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void VersionedMap::Impl::printInOrderHelper(int64_t version, uint32_t node,
|
inline void VersionedMap::Impl::printInOrderHelper(int64_t version,
|
||||||
int depth) {
|
uint32_t node, int depth) {
|
||||||
if (node == 0) {
|
if (node == 0) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
8
aarch64-symbol-imports.txt
Normal file
8
aarch64-symbol-imports.txt
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
__stack_chk_fail@GLIBC_2.17
|
||||||
|
__stack_chk_guard@GLIBC_2.17
|
||||||
|
abort@GLIBC_2.17
|
||||||
|
free@GLIBC_2.17
|
||||||
|
malloc@GLIBC_2.17
|
||||||
|
memcpy@GLIBC_2.17
|
||||||
|
memmove@GLIBC_2.17
|
||||||
|
memset@GLIBC_2.17
|
31
apple-symbol-exports.txt
Normal file
31
apple-symbol-exports.txt
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
__ZN8weaselab12VersionedMap12addMutationsEPKNS0_8MutationEix
|
||||||
|
__ZN8weaselab12VersionedMap16setOldestVersionEx
|
||||||
|
__ZN8weaselab12VersionedMap8IteratorC1EOS1_
|
||||||
|
__ZN8weaselab12VersionedMap8IteratorC1ERKS1_
|
||||||
|
__ZN8weaselab12VersionedMap8IteratorC2EOS1_
|
||||||
|
__ZN8weaselab12VersionedMap8IteratorC2ERKS1_
|
||||||
|
__ZN8weaselab12VersionedMap8IteratorD1Ev
|
||||||
|
__ZN8weaselab12VersionedMap8IteratorD2Ev
|
||||||
|
__ZN8weaselab12VersionedMap8IteratoraSEOS1_
|
||||||
|
__ZN8weaselab12VersionedMap8IteratoraSERKS1_
|
||||||
|
__ZN8weaselab12VersionedMap8IteratormmEi
|
||||||
|
__ZN8weaselab12VersionedMap8IteratormmEv
|
||||||
|
__ZN8weaselab12VersionedMap8IteratorppEi
|
||||||
|
__ZN8weaselab12VersionedMap8IteratorppEv
|
||||||
|
__ZN8weaselab12VersionedMapC1EOS0_
|
||||||
|
__ZN8weaselab12VersionedMapC1Ex
|
||||||
|
__ZN8weaselab12VersionedMapC2EOS0_
|
||||||
|
__ZN8weaselab12VersionedMapC2Ex
|
||||||
|
__ZN8weaselab12VersionedMapD1Ev
|
||||||
|
__ZN8weaselab12VersionedMapD2Ev
|
||||||
|
__ZN8weaselab12VersionedMapaSEOS0_
|
||||||
|
__ZNK8weaselab12VersionedMap10getVersionEv
|
||||||
|
__ZNK8weaselab12VersionedMap16getOldestVersionEv
|
||||||
|
__ZNK8weaselab12VersionedMap3endEx
|
||||||
|
__ZNK8weaselab12VersionedMap5beginEx
|
||||||
|
__ZNK8weaselab12VersionedMap8Iterator3cmpEv
|
||||||
|
__ZNK8weaselab12VersionedMap8IteratordeEv
|
||||||
|
__ZNK8weaselab12VersionedMap8IteratoreqERKS1_
|
||||||
|
__ZNK8weaselab12VersionedMap8IteratorneERKS1_
|
||||||
|
__ZNK8weaselab12VersionedMap8firstGeqEPKNS0_3KeyEPKxPNS0_8IteratorEi
|
||||||
|
__ZNK8weaselab12VersionedMap8getBytesEv
|
21
apple-symbol-imports.txt
Normal file
21
apple-symbol-imports.txt
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
___error
|
||||||
|
___memcpy_chk
|
||||||
|
___stack_chk_fail
|
||||||
|
___stack_chk_guard
|
||||||
|
___stderrp
|
||||||
|
__tlv_bootstrap
|
||||||
|
_abort
|
||||||
|
_bzero
|
||||||
|
_calloc
|
||||||
|
_fflush
|
||||||
|
_fprintf
|
||||||
|
_free
|
||||||
|
_fwrite
|
||||||
|
_malloc
|
||||||
|
_memcmp
|
||||||
|
_memcpy
|
||||||
|
_mmap
|
||||||
|
_mprotect
|
||||||
|
_munmap
|
||||||
|
_strerror
|
||||||
|
_sysconf
|
@@ -37,7 +37,7 @@ namespace weaselab {
|
|||||||
* - Methods that make stronger guarantees about the safety of calling
|
* - Methods that make stronger guarantees about the safety of calling
|
||||||
* concurrently with non-const methods are documented as such.
|
* concurrently with non-const methods are documented as such.
|
||||||
*/
|
*/
|
||||||
struct VersionedMap {
|
struct __attribute__((__visibility__("default"))) VersionedMap {
|
||||||
|
|
||||||
/** Indicates how `Mutation::param1` and `Mutation::param2` are to be
|
/** Indicates how `Mutation::param1` and `Mutation::param2` are to be
|
||||||
* interpreted. */
|
* interpreted. */
|
||||||
|
6
linker.map
Normal file
6
linker.map
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
global:
|
||||||
|
*ConflictSet*;
|
||||||
|
local:
|
||||||
|
*;
|
||||||
|
};
|
17
symbol-exports.txt
Normal file
17
symbol-exports.txt
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
ConflictSet_addWrites
|
||||||
|
ConflictSet_check
|
||||||
|
ConflictSet_create
|
||||||
|
ConflictSet_destroy
|
||||||
|
ConflictSet_getBytes
|
||||||
|
ConflictSet_setOldestVersion
|
||||||
|
_ZN8weaselab11ConflictSet16setOldestVersionEl
|
||||||
|
_ZN8weaselab11ConflictSet9addWritesEPKNS0_10WriteRangeEil
|
||||||
|
_ZN8weaselab11ConflictSetaSEOS0_
|
||||||
|
_ZN8weaselab11ConflictSetC1El
|
||||||
|
_ZN8weaselab11ConflictSetC1EOS0_
|
||||||
|
_ZN8weaselab11ConflictSetC2El
|
||||||
|
_ZN8weaselab11ConflictSetC2EOS0_
|
||||||
|
_ZN8weaselab11ConflictSetD1Ev
|
||||||
|
_ZN8weaselab11ConflictSetD2Ev
|
||||||
|
_ZNK8weaselab11ConflictSet5checkEPKNS0_9ReadRangeEPNS0_6ResultEi
|
||||||
|
_ZNK8weaselab11ConflictSet8getBytesEv
|
9
symbol-imports.txt
Normal file
9
symbol-imports.txt
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
_GLOBAL_OFFSET_TABLE_
|
||||||
|
__stack_chk_fail@GLIBC_2.4
|
||||||
|
__tls_get_addr@GLIBC_2.3
|
||||||
|
abort@GLIBC_2.2.5
|
||||||
|
free@GLIBC_2.2.5
|
||||||
|
malloc@GLIBC_2.2.5
|
||||||
|
memcpy@GLIBC_2.14
|
||||||
|
memmove@GLIBC_2.2.5
|
||||||
|
memset@GLIBC_2.2.5
|
16
test_symbols.sh
Executable file
16
test_symbols.sh
Executable file
@@ -0,0 +1,16 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
# ./test_symbols.sh <library> <expected exported symbols file> <allowed imported symbols file>
|
||||||
|
|
||||||
|
diff -u <(sort < "$2") <(nm "$1" | grep " T " | cut -f3 -d " " | sort)
|
||||||
|
ec=0
|
||||||
|
for symbol in $(nm "$1" | grep " U " | sed 's/ U //') ; do
|
||||||
|
if ! grep --fixed-strings "$symbol" "$3" > /dev/null ; then
|
||||||
|
echo "Imported symbol $symbol not present in $3"
|
||||||
|
ec=1
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
exit $ec
|
2
third_party/CMakeLists.txt
vendored
2
third_party/CMakeLists.txt
vendored
@@ -2,6 +2,6 @@ add_library(nanobench ${CMAKE_CURRENT_SOURCE_DIR}/nanobench.cpp)
|
|||||||
target_include_directories(nanobench SYSTEM
|
target_include_directories(nanobench SYSTEM
|
||||||
PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include/nanobench)
|
PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include/nanobench)
|
||||||
|
|
||||||
add_library(xxhash ${CMAKE_CURRENT_SOURCE_DIR}/xxhash.c)
|
add_library(xxhash OBJECT ${CMAKE_CURRENT_SOURCE_DIR}/xxhash.c)
|
||||||
target_include_directories(xxhash SYSTEM
|
target_include_directories(xxhash SYSTEM
|
||||||
PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include/xxhash)
|
PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include/xxhash)
|
||||||
|
Reference in New Issue
Block a user