From ad91fb36a59940e3ba94475cc8ee83b0f7d277cc Mon Sep 17 00:00:00 2001 From: Andrew Noyes Date: Wed, 3 Apr 2024 12:50:51 -0700 Subject: [PATCH] Symbol tests for macos + whitelist imports/exports commit 1ad8276100d805030c8c03ec590a98f76251a768 Author: Andrew Noyes Date: Wed Apr 3 12:44:35 2024 -0700 Add symbols for arm build commit 058e4d5302b7ebb5e596ce8a62a7497705a83c55 Author: Andrew Noyes Date: Wed Apr 3 12:42:48 2024 -0700 Add _GLOBAL_OFFSET_TABLE_ commit a201f3ada81bb6887b2b7f9e5f34250f3b02efb9 Author: Andrew Noyes Date: Wed Apr 3 12:34:05 2024 -0700 Add memset to symbol imports commit c1129ed0e270c851623af2ab817b375f1972ac43 Author: Andrew Noyes Date: Wed Apr 3 12:32:28 2024 -0700 Add symbol imports file commit 618766ce2e3fcff00e0a5321e61cde45663a5b73 Author: Andrew Noyes Date: Wed Apr 3 12:27:07 2024 -0700 Fix objcopy filepath commit e774a900075ad5f50ce84ff56dffaa7d370b3cd2 Author: Andrew Noyes Date: Wed Apr 3 12:24:44 2024 -0700 Use shellcheck precommit without docker commit baddea7f578812e7224d0f51d076208f2ddde401 Author: Andrew Noyes Date: Wed Apr 3 12:20:26 2024 -0700 Update and freeze pre-commit hooks commit 2d3e7b9004e98255164b842ea6a07022ad53ccbd Author: Andrew Noyes Date: Wed Apr 3 12:19:55 2024 -0700 Add shellcheck to pre-commit Closes #22 commit c4862fee9b107735c614b6df74e89e85f304fd63 Author: Andrew Noyes Date: Wed Apr 3 12:15:08 2024 -0700 Add symbol tests for apple closes #21 --- .pre-commit-config.yaml | 10 +++++++--- CMakeLists.txt | 22 +++++++++++++++------- ConflictSet.cpp | 2 +- HashTable.cpp | 2 +- SkipList.cpp | 2 +- apple-symbol-exports.txt | 17 +++++++++++++++++ apple-symbol-imports.txt | 7 +++++++ privatize_symbols_macos.sh | 2 +- symbols.txt => symbol-exports.txt | 0 symbol-imports.txt | 17 +++++++++++++++++ test_symbols.sh | 12 +++++++++++- 11 files changed, 78 insertions(+), 15 deletions(-) create mode 100644 apple-symbol-exports.txt create mode 100644 apple-symbol-imports.txt rename symbols.txt => symbol-exports.txt (100%) create mode 100644 symbol-imports.txt diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 5f3fcc1..6b0f69e 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,11 +1,11 @@ repos: - repo: https://github.com/pre-commit/mirrors-clang-format - rev: b111689e7b5cba60be3c62d5db2bd1357f4d36ca + rev: 6d365699efc33b1b432eab5b4ae331a19e1857de # frozen: v18.1.2 hooks: - id: clang-format exclude: ".*third_party/.*" - repo: https://github.com/cheshirekow/cmake-format-precommit - rev: e2c2116d86a80e72e7146a06e68b7c228afc6319 + rev: e2c2116d86a80e72e7146a06e68b7c228afc6319 # frozen: v0.6.13 hooks: - id: cmake-format - repo: local @@ -23,4 +23,8 @@ repos: description: disallow checking in SHOW_MEMORY=1 entry: '^#define SHOW_MEMORY 1$' language: pygrep - types: [c++] \ No newline at end of file + types: [c++] + - repo: https://github.com/shellcheck-py/shellcheck-py + rev: a23f6b85d0fdd5bb9d564e2579e678033debbdff # frozen: v0.10.0.1 + hooks: + - id: shellcheck \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt index 0043f55..cfc6cdd 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -136,7 +136,8 @@ else() TARGET ${PROJECT_NAME}-static POST_BUILD COMMAND - ${CMAKE_OBJCOPY} --keep-global-symbols=${CMAKE_SOURCE_DIR}/symbols.txt + ${CMAKE_OBJCOPY} + --keep-global-symbols=${CMAKE_SOURCE_DIR}/symbol-exports.txt $ || echo "Proceeding with all symbols global in static library") endif() @@ -295,18 +296,25 @@ if(BUILD_TESTING) add_test(NAME conflict_set_cxx_api_test COMMAND conflict_set_cxx_api_test) # symbol visibility tests - if(NOT WASM - AND NOT APPLE - AND NOT CMAKE_BUILD_TYPE STREQUAL Debug) + if(NOT WASM AND 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) + set(symbol_imports ${CMAKE_SOURCE_DIR}/symbol-imports.txt) + endif() add_test( NAME conflict_set_shared_symbols - COMMAND ${CMAKE_SOURCE_DIR}/test_symbols.sh - $ ${CMAKE_SOURCE_DIR}/symbols.txt) + COMMAND + ${CMAKE_SOURCE_DIR}/test_symbols.sh $ + ${symbol_exports} ${symbol_imports}) add_test( NAME conflict_set_static_symbols COMMAND ${CMAKE_SOURCE_DIR}/test_symbols.sh - $ ${CMAKE_SOURCE_DIR}/symbols.txt) + $ ${symbol_exports} + ${symbol_imports}) endif() # bench diff --git a/ConflictSet.cpp b/ConflictSet.cpp index cae6fa1..fd43fdf 100644 --- a/ConflictSet.cpp +++ b/ConflictSet.cpp @@ -2614,7 +2614,7 @@ int64_t ConflictSet::getBytes() const { return impl->totalBytes; } ConflictSet::ConflictSet(int64_t oldestVersion) : impl((mallocBytesDelta = 0, - new (safe_malloc(sizeof(Impl))) Impl{oldestVersion})) { + new(safe_malloc(sizeof(Impl))) Impl{oldestVersion})) { impl->totalBytes += mallocBytesDelta; } diff --git a/HashTable.cpp b/HashTable.cpp index 8f44f3e..fc6f434 100644 --- a/HashTable.cpp +++ b/HashTable.cpp @@ -99,7 +99,7 @@ void ConflictSet::setOldestVersion(int64_t oldestVersion) { int64_t ConflictSet::getBytes() const { return -1; } ConflictSet::ConflictSet(int64_t oldestVersion) - : impl(new (safe_malloc(sizeof(Impl))) Impl{oldestVersion}) {} + : impl(new(safe_malloc(sizeof(Impl))) Impl{oldestVersion}) {} ConflictSet::~ConflictSet() { if (impl) { diff --git a/SkipList.cpp b/SkipList.cpp index 9ea5792..6b47a44 100644 --- a/SkipList.cpp +++ b/SkipList.cpp @@ -669,7 +669,7 @@ int64_t ConflictSet::getBytes() const { return impl->totalBytes; } ConflictSet::ConflictSet(int64_t oldestVersion) : impl((mallocBytesDelta = 0, - new (safe_malloc(sizeof(Impl))) Impl{oldestVersion})) { + new(safe_malloc(sizeof(Impl))) Impl{oldestVersion})) { impl->totalBytes += mallocBytesDelta; } diff --git a/apple-symbol-exports.txt b/apple-symbol-exports.txt new file mode 100644 index 0000000..3ed1c91 --- /dev/null +++ b/apple-symbol-exports.txt @@ -0,0 +1,17 @@ +_ConflictSet_addWrites +_ConflictSet_check +_ConflictSet_create +_ConflictSet_destroy +_ConflictSet_getBytes +_ConflictSet_setOldestVersion +__ZN8weaselab11ConflictSet16setOldestVersionEx +__ZN8weaselab11ConflictSet9addWritesEPKNS0_10WriteRangeEix +__ZN8weaselab11ConflictSetC1EOS0_ +__ZN8weaselab11ConflictSetC1Ex +__ZN8weaselab11ConflictSetC2EOS0_ +__ZN8weaselab11ConflictSetC2Ex +__ZN8weaselab11ConflictSetD1Ev +__ZN8weaselab11ConflictSetD2Ev +__ZN8weaselab11ConflictSetaSEOS0_ +__ZNK8weaselab11ConflictSet5checkEPKNS0_9ReadRangeEPNS0_6ResultEi +__ZNK8weaselab11ConflictSet8getBytesEv diff --git a/apple-symbol-imports.txt b/apple-symbol-imports.txt new file mode 100644 index 0000000..a7d4e8b --- /dev/null +++ b/apple-symbol-imports.txt @@ -0,0 +1,7 @@ +__tlv_bootstrap +_abort +_bzero +_free +_malloc +_memcpy +_memmove \ No newline at end of file diff --git a/privatize_symbols_macos.sh b/privatize_symbols_macos.sh index 4e964eb..2e1b16b 100755 --- a/privatize_symbols_macos.sh +++ b/privatize_symbols_macos.sh @@ -2,5 +2,5 @@ # This has the effect of making visibility=hidden symbols private in object files for obj in "$@" ; do - ld -r $obj -o $obj.tmp && mv $obj.tmp $obj + ld -r "$obj" -o "$obj.tmp" && mv "$obj.tmp" "$obj" done diff --git a/symbols.txt b/symbol-exports.txt similarity index 100% rename from symbols.txt rename to symbol-exports.txt diff --git a/symbol-imports.txt b/symbol-imports.txt new file mode 100644 index 0000000..a117bb0 --- /dev/null +++ b/symbol-imports.txt @@ -0,0 +1,17 @@ +_GLOBAL_OFFSET_TABLE_ +__stack_chk_fail@GLIBC_2.17 +__stack_chk_fail@GLIBC_2.4 +__stack_chk_guard@GLIBC_2.17 +__tls_get_addr@GLIBC_2.3 +abort@GLIBC_2.17 +abort@GLIBC_2.2.5 +free@GLIBC_2.17 +free@GLIBC_2.2.5 +malloc@GLIBC_2.17 +malloc@GLIBC_2.2.5 +memcpy@GLIBC_2.14 +memcpy@GLIBC_2.17 +memmove@GLIBC_2.17 +memmove@GLIBC_2.2.5 +memset@GLIBC_2.17 +memset@GLIBC_2.2.5 \ No newline at end of file diff --git a/test_symbols.sh b/test_symbols.sh index 40fd9f6..f6c41e3 100755 --- a/test_symbols.sh +++ b/test_symbols.sh @@ -2,5 +2,15 @@ set -euo pipefail +# ./test_symbols.sh + diff -u <(sort < "$2") <(nm "$1" | grep " T " | cut -f3 -d " " | sort) -nm "$1" | grep " U " | (! grep -Pv 'abort|free|malloc|mem[a-z]*|__ashlti3|__stack_chk_[a-z]*|__tls_get_addr|_GLOBAL_OFFSET_TABLE_') +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 \ No newline at end of file