Index: llvm/trunk/cmake/modules/HandleLLVMOptions.cmake =================================================================== --- llvm/trunk/cmake/modules/HandleLLVMOptions.cmake +++ llvm/trunk/cmake/modules/HandleLLVMOptions.cmake @@ -151,6 +151,14 @@ set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,-z,defs") endif() +# Pass -Wl,-z,nodelete. This makes sure our shared libraries are not unloaded +# by dlclose(). We need that since the CLI API relies on cross-references +# between global objects which became horribly broken when one of the libraries +# is unloaded. +if(${CMAKE_SYSTEM_NAME} MATCHES "Linux") + set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,-z,nodelete") +endif() + function(append value) foreach(variable ${ARGN}) Index: llvm/trunk/unittests/Support/DynamicLibrary/CMakeLists.txt =================================================================== --- llvm/trunk/unittests/Support/DynamicLibrary/CMakeLists.txt +++ llvm/trunk/unittests/Support/DynamicLibrary/CMakeLists.txt @@ -24,5 +24,12 @@ add_dependencies(DynamicLibraryTests ${NAME}) endfunction(dynlib_add_module) +# Revert -Wl,-z,nodelete on this test since it relies on the file +# being unloaded. +if(${CMAKE_SYSTEM_NAME} MATCHES "Linux") + string(REPLACE "-Wl,-z,nodelete" "" CMAKE_SHARED_LINKER_FLAGS + ${CMAKE_SHARED_LINKER_FLAGS}) +endif() + dynlib_add_module(PipSqueak) dynlib_add_module(SecondLib)