diff options
| -rw-r--r-- | llvm/cmake/modules/HandleLLVMOptions.cmake | 8 | ||||
| -rw-r--r-- | llvm/unittests/Support/DynamicLibrary/CMakeLists.txt | 7 |
2 files changed, 15 insertions, 0 deletions
diff --git a/llvm/cmake/modules/HandleLLVMOptions.cmake b/llvm/cmake/modules/HandleLLVMOptions.cmake index c5390371845..b5059a8a60e 100644 --- a/llvm/cmake/modules/HandleLLVMOptions.cmake +++ b/llvm/cmake/modules/HandleLLVMOptions.cmake @@ -151,6 +151,14 @@ if(NOT (${CMAKE_SYSTEM_NAME} MATCHES "Darwin" OR WIN32 OR CYGWIN OR 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}) diff --git a/llvm/unittests/Support/DynamicLibrary/CMakeLists.txt b/llvm/unittests/Support/DynamicLibrary/CMakeLists.txt index 9355979221a..c6201b1ad31 100644 --- a/llvm/unittests/Support/DynamicLibrary/CMakeLists.txt +++ b/llvm/unittests/Support/DynamicLibrary/CMakeLists.txt @@ -24,5 +24,12 @@ function(dynlib_add_module NAME) 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) |

