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);

Reply via email to