This is an automated email from the ASF dual-hosted git repository. pengzheng pushed a commit to branch hotfix/492-unresolved-symbols-check in repository https://gitbox.apache.org/repos/asf/celix.git
commit eedd85449811c870e1cd3d3fc27668371350099e Author: PengZheng <[email protected]> AuthorDate: Mon Apr 28 12:59:07 2025 +0800 Check for unresolved symbols at build-time rather than runtime. Fix various unresolved symbols errors. --- .../examples/calculator_service/CMakeLists.txt | 2 +- .../examples/remote_example_service/CMakeLists.txt | 2 +- cmake/celix_project/CelixProject.cmake | 26 ++++++++++++++++++++-- cmake/cmake_celix/BundlePackaging.cmake | 5 +++++ libs/framework/src/celix_libloader.c | 4 ++-- 5 files changed, 33 insertions(+), 6 deletions(-) diff --git a/bundles/remote_services/examples/calculator_service/CMakeLists.txt b/bundles/remote_services/examples/calculator_service/CMakeLists.txt index 0c010a5b0..bc7fcfb44 100644 --- a/bundles/remote_services/examples/calculator_service/CMakeLists.txt +++ b/bundles/remote_services/examples/calculator_service/CMakeLists.txt @@ -23,7 +23,7 @@ add_celix_bundle(calculator VERSION 0.0.1 ) target_include_directories(calculator PRIVATE src) -target_link_libraries(calculator PRIVATE Celix::c_rsa_spi calculator_api) +target_link_libraries(calculator PRIVATE Celix::c_rsa_spi calculator_api m) get_target_property(DESCR calculator_api INTERFACE_DESCRIPTOR) celix_bundle_files(calculator ${DESCR} DESTINATION .) diff --git a/bundles/remote_services/examples/remote_example_service/CMakeLists.txt b/bundles/remote_services/examples/remote_example_service/CMakeLists.txt index fa94c150b..61e2d5403 100644 --- a/bundles/remote_services/examples/remote_example_service/CMakeLists.txt +++ b/bundles/remote_services/examples/remote_example_service/CMakeLists.txt @@ -23,7 +23,7 @@ add_celix_bundle(remote_example_service VERSION 0.0.1 ) target_include_directories(remote_example_service PRIVATE src) -target_link_libraries(remote_example_service PRIVATE Celix::c_rsa_spi remote_example_api) +target_link_libraries(remote_example_service PRIVATE Celix::c_rsa_spi remote_example_api m) get_target_property(DESCR remote_example_api INTERFACE_DESCRIPTOR) celix_bundle_files(remote_example_service ${DESCR} DESTINATION .) diff --git a/cmake/celix_project/CelixProject.cmake b/cmake/celix_project/CelixProject.cmake index 9812155e6..96b6e1ea8 100644 --- a/cmake/celix_project/CelixProject.cmake +++ b/cmake/celix_project/CelixProject.cmake @@ -26,8 +26,30 @@ mark_as_advanced(CLEAR ENABLE_THREAD_SANITIZER) if (ENABLE_ADDRESS_SANITIZER) if("${CMAKE_C_COMPILER_ID}" MATCHES "Clang") - set(CMAKE_C_FLAGS "-fsanitize=address -fno-omit-frame-pointer ${CMAKE_C_FLAGS}") - set(CMAKE_CXX_FLAGS "-fsanitize=address -fno-omit-frame-pointer ${CMAKE_CXX_FLAGS}") + set(CMAKE_C_FLAGS "-shared-libasan -fsanitize=address -fno-omit-frame-pointer ${CMAKE_C_FLAGS}") + set(CMAKE_CXX_FLAGS "-shared-libasan -fsanitize=address -fno-omit-frame-pointer ${CMAKE_CXX_FLAGS}") + if (NOT APPLE) + # Fix a linux clang deficiency where the ASan runtime library is not found automatically + # Find the ASan runtime library path and set RPATH + execute_process( + COMMAND ${CMAKE_CXX_COMPILER} --print-file-name libclang_rt.asan-x86_64.so + OUTPUT_VARIABLE ASAN_LIB_PATH + OUTPUT_STRIP_TRAILING_WHITESPACE + RESULT_VARIABLE ASAN_FIND_RESULT + ERROR_QUIET # Avoid printing errors if the command fails during configuration + ) + + if (ASAN_FIND_RESULT EQUAL 0 AND EXISTS "${ASAN_LIB_PATH}") + get_filename_component(ASAN_LIB_DIR ${ASAN_LIB_PATH} DIRECTORY) + message(STATUS "Setting ASan RPATH to: ${ASAN_LIB_DIR}") + set(ASAN_RPATH_FLAG "-Wl,-rpath,${ASAN_LIB_DIR}") + # Append to executable, shared library, and module linker flags + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${ASAN_RPATH_FLAG}") + set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${ASAN_RPATH_FLAG}") + else() + message(WARNING "Could not determine path for libclang_rt.asan-x86_64.so using ${CMAKE_CXX_COMPILER}. ASan RPATH not set automatically.") + endif() + endif () elseif ("${CMAKE_C_COMPILER_ID}" STREQUAL "GNU") set(CMAKE_C_FLAGS "-lasan -fsanitize=address -fno-omit-frame-pointer ${CMAKE_C_FLAGS}") set(CMAKE_CXX_FLAGS "-lasan -fsanitize=address -fno-omit-frame-pointer ${CMAKE_CXX_FLAGS}") diff --git a/cmake/cmake_celix/BundlePackaging.cmake b/cmake/cmake_celix/BundlePackaging.cmake index 4be1c48f7..9c1335e87 100644 --- a/cmake/cmake_celix/BundlePackaging.cmake +++ b/cmake/cmake_celix/BundlePackaging.cmake @@ -251,6 +251,11 @@ function(add_celix_bundle) "BUNDLE_TARGET" "${BUNDLE_TARGET_NAME}_bundle" ) target_link_libraries(${BUNDLE_TARGET_NAME} PRIVATE Celix::framework) + if(APPLE) + target_link_options(${BUNDLE_TARGET_NAME} PRIVATE "-Wl,-undefined,error") + else () + target_link_options(${BUNDLE_TARGET_NAME} PRIVATE "-Wl,-z,defs") + endif() else () add_custom_target(${BUNDLE_TARGET_NAME}) set_target_properties(${BUNDLE_TARGET_NAME} PROPERTIES diff --git a/libs/framework/src/celix_libloader.c b/libs/framework/src/celix_libloader.c index f11053bff..ea2bdbf62 100644 --- a/libs/framework/src/celix_libloader.c +++ b/libs/framework/src/celix_libloader.c @@ -29,9 +29,9 @@ celix_library_handle_t* celix_libloader_open(celix_bundle_context_t *ctx, const #endif celix_library_handle_t* handle = NULL; bool noDelete = celix_bundleContext_getPropertyAsBool(ctx, CELIX_LOAD_BUNDLES_WITH_NODELETE, defaultNoDelete); - int flags = RTLD_NOW|RTLD_LOCAL; + int flags = RTLD_LAZY|RTLD_LOCAL; if (noDelete) { - flags = RTLD_NOW|RTLD_LOCAL|RTLD_NODELETE; + flags = RTLD_LAZY|RTLD_LOCAL|RTLD_NODELETE; } handle = dlopen(libPath, flags);
