diff --git a/debian/changelog b/debian/changelog index f37de2a3..6a6ef0e6 100644 --- a/debian/changelog +++ b/debian/changelog @@ -4,6 +4,9 @@ llvm-toolchain-snapshot (1:5.0~svn298832-1~exp1) experimental; urgency=medium * Explicit the dep of clang-tidy on same version of llvm to avoid undefined symbols + [ Rebecca N. Palmer ] + * Use versioned symbols (Closes: #848368) + -- Sylvestre Ledru Mon, 27 Mar 2017 09:15:16 +0200 llvm-toolchain-snapshot (1:5.0~svn294583-1~exp1) experimental; urgency=medium diff --git a/debian/patches/add_symbols_versioning.patch b/debian/patches/add_symbols_versioning.patch new file mode 100644 index 00000000..e349c8c5 --- /dev/null +++ b/debian/patches/add_symbols_versioning.patch @@ -0,0 +1,46 @@ +Description: add a simple linker script to version LLVM symbols + +This patch adds a very simple linker script to version the lib's symbols +and thus trying to avoid crashes if an application loads two different +LLVM versions (as long as they do not share data between them). + +Note that we deliberately *don't* make LLVM_5.0 depend on LLVM_5.0: +they're incompatible and the whole point of this patch is +to tell the linker that. + +Author: Rebecca N. Palmer +Author: Lisandro Damían Nicanor Pérez Meyer +Bug-Debian: https://bugs.debian.org/848368 + +Index: llvm-toolchain-snapshot_5.0~svn298832/tools/llvm-shlib/CMakeLists.txt +=================================================================== +--- llvm-toolchain-snapshot_5.0~svn298832.orig/tools/llvm-shlib/CMakeLists.txt ++++ llvm-toolchain-snapshot_5.0~svn298832/tools/llvm-shlib/CMakeLists.txt +@@ -40,7 +40,7 @@ set_property(TARGET LLVM PROPERTY VERSIO + list(REMOVE_DUPLICATES LIB_NAMES) + if(("${CMAKE_SYSTEM_NAME}" STREQUAL "Linux") OR (MINGW) OR ("${CMAKE_SYSTEM_NAME}" STREQUAL "FreeBSD") OR ("${CMAKE_SYSTEM_NAME}" STREQUAL "DragonFly")) # FIXME: It should be "GNU ld for elf" + # GNU ld doesn't resolve symbols in the version script. +- set(LIB_NAMES -Wl,--whole-archive ${LIB_NAMES} -Wl,--no-whole-archive) ++ set(LIB_NAMES -Wl,--version-script,${CMAKE_CURRENT_SOURCE_DIR}/simple_version_script.map -Wl,--whole-archive ${LIB_NAMES} -Wl,--no-whole-archive) + elseif("${CMAKE_SYSTEM_NAME}" STREQUAL "Darwin") + set(LIB_NAMES -Wl,-all_load ${LIB_NAMES}) + endif() +Index: llvm-toolchain-snapshot_5.0~svn298832/tools/llvm-shlib/simple_version_script.map +=================================================================== +--- /dev/null ++++ llvm-toolchain-snapshot_5.0~svn298832/tools/llvm-shlib/simple_version_script.map +@@ -0,0 +1 @@ ++LLVM_5.0 { global: *; }; +Index: llvm-toolchain-snapshot_5.0~svn298832/cmake/modules/AddLLVM.cmake +=================================================================== +--- llvm-toolchain-snapshot_5.0~svn298832.orig/cmake/modules/AddLLVM.cmake ++++ llvm-toolchain-snapshot_5.0~svn298832/cmake/modules/AddLLVM.cmake +@@ -82,7 +82,7 @@ function(add_llvm_symbol_exports target_ + set(native_export_file "${target_name}.exports") + # FIXME: Don't write the "local:" line on OpenBSD. + add_custom_command(OUTPUT ${native_export_file} +- COMMAND echo "{" > ${native_export_file} ++ COMMAND echo "LLVM_5.0 {" > ${native_export_file} + COMMAND grep -q "[[:alnum:]]" ${export_file} && echo " global:" >> ${native_export_file} || : + COMMAND sed -e "s/$/;/" -e "s/^/ /" < ${export_file} >> ${native_export_file} + COMMAND echo " local: *;" >> ${native_export_file} diff --git a/debian/patches/series b/debian/patches/series index 444f7b8d..9a77fabe 100644 --- a/debian/patches/series +++ b/debian/patches/series @@ -44,3 +44,4 @@ lldb-addversion-suffix-to-llvm-server-exec.patch lldb-missing-install.diff silent-test-failing-codeverage.diff disable-path-test-failing.diff +add_symbols_versioning.patch