mirror of
https://github.com/gentoo-mirror/gentoo.git
synced 2026-09-23 16:49:10 -07:00
sys-devel/llvm: Backport unloading prevention fix
Bug: https://bugs.gentoo.org/617154
This commit is contained in:
@@ -0,0 +1,56 @@
|
||||
From 937b23b5fffa59deb1dc342cc5602d387d84a762 Mon Sep 17 00:00:00 2001
|
||||
From: Michal Gorny <mgorny@gentoo.org>
|
||||
Date: Mon, 27 Nov 2017 22:23:09 +0000
|
||||
Subject: [PATCH] [cmake] Pass -Wl,-z,nodelete on Linux to prevent unloading
|
||||
|
||||
Prevent unloading shared libraries on Linux when dlclose() is called.
|
||||
This is necessary since command-line option parsing API relies on
|
||||
registering the global option instances in the option parser instance
|
||||
which can be loaded in a different shared library.
|
||||
|
||||
Given that we can't reliably remove those options when a library is
|
||||
unloaded, the parser ends up containing dangling references. Since glibc
|
||||
has relatively complex library unloading rules, some of the LLVM
|
||||
libraries can be unloaded while others (including the Support library)
|
||||
stay loaded causing quite a mayhem. To reliably prevent that, just
|
||||
forbid unloading all libraries -- it's a very bad idea anyway.
|
||||
|
||||
While the issue arguably happens only with BUILD_SHARED_LIBS, it may
|
||||
affect any library reusing llvm::cl interface.
|
||||
|
||||
Based on patch provided Ross Hayward on https://bugs.gentoo.org/617154.
|
||||
Previously hit by Fedora back in Feb 2016:
|
||||
https://lists.freedesktop.org/archives/mesa-dev/2016-February/107242.html
|
||||
|
||||
Differential Revision: https://reviews.llvm.org/D40459
|
||||
|
||||
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@319105 91177308-0d34-0410-b5e6-96231b3b80d8
|
||||
---
|
||||
cmake/modules/HandleLLVMOptions.cmake | 8 ++++++++
|
||||
unittests/Support/DynamicLibrary/CMakeLists.txt | 7 +++++++
|
||||
2 files changed, 15 insertions(+)
|
||||
|
||||
4.0.1 backport: removed the unittest part
|
||||
|
||||
diff --git a/cmake/modules/HandleLLVMOptions.cmake b/cmake/modules/HandleLLVMOptions.cmake
|
||||
index c5390371845..b5059a8a60e 100644
|
||||
--- a/cmake/modules/HandleLLVMOptions.cmake
|
||||
+++ b/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})
|
||||
--
|
||||
2.15.1
|
||||
|
||||
@@ -0,0 +1,71 @@
|
||||
From 937b23b5fffa59deb1dc342cc5602d387d84a762 Mon Sep 17 00:00:00 2001
|
||||
From: Michal Gorny <mgorny@gentoo.org>
|
||||
Date: Mon, 27 Nov 2017 22:23:09 +0000
|
||||
Subject: [PATCH] [cmake] Pass -Wl,-z,nodelete on Linux to prevent unloading
|
||||
|
||||
Prevent unloading shared libraries on Linux when dlclose() is called.
|
||||
This is necessary since command-line option parsing API relies on
|
||||
registering the global option instances in the option parser instance
|
||||
which can be loaded in a different shared library.
|
||||
|
||||
Given that we can't reliably remove those options when a library is
|
||||
unloaded, the parser ends up containing dangling references. Since glibc
|
||||
has relatively complex library unloading rules, some of the LLVM
|
||||
libraries can be unloaded while others (including the Support library)
|
||||
stay loaded causing quite a mayhem. To reliably prevent that, just
|
||||
forbid unloading all libraries -- it's a very bad idea anyway.
|
||||
|
||||
While the issue arguably happens only with BUILD_SHARED_LIBS, it may
|
||||
affect any library reusing llvm::cl interface.
|
||||
|
||||
Based on patch provided Ross Hayward on https://bugs.gentoo.org/617154.
|
||||
Previously hit by Fedora back in Feb 2016:
|
||||
https://lists.freedesktop.org/archives/mesa-dev/2016-February/107242.html
|
||||
|
||||
Differential Revision: https://reviews.llvm.org/D40459
|
||||
|
||||
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@319105 91177308-0d34-0410-b5e6-96231b3b80d8
|
||||
---
|
||||
cmake/modules/HandleLLVMOptions.cmake | 8 ++++++++
|
||||
unittests/Support/DynamicLibrary/CMakeLists.txt | 7 +++++++
|
||||
2 files changed, 15 insertions(+)
|
||||
|
||||
diff --git a/cmake/modules/HandleLLVMOptions.cmake b/cmake/modules/HandleLLVMOptions.cmake
|
||||
index c5390371845..b5059a8a60e 100644
|
||||
--- a/cmake/modules/HandleLLVMOptions.cmake
|
||||
+++ b/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/unittests/Support/DynamicLibrary/CMakeLists.txt b/unittests/Support/DynamicLibrary/CMakeLists.txt
|
||||
index 9355979221a..c6201b1ad31 100644
|
||||
--- a/unittests/Support/DynamicLibrary/CMakeLists.txt
|
||||
+++ b/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)
|
||||
--
|
||||
2.15.1
|
||||
|
||||
@@ -75,6 +75,10 @@ src_prepare() {
|
||||
# https://bugs.gentoo.org/show_bug.cgi?id=565358
|
||||
eapply "${FILESDIR}"/9999/0007-llvm-config-Clean-up-exported-values-update-for-shar.patch
|
||||
|
||||
# Backport the fix for dlclose() causing option parser mess
|
||||
# e.g. https://bugs.gentoo.org/617154
|
||||
eapply "${FILESDIR}"/4.0.1/0001-cmake-Pass-Wl-z-nodelete-on-Linux-to-prevent-unloadi.patch
|
||||
|
||||
# support building llvm against musl-libc
|
||||
use elibc_musl && eapply "${FILESDIR}"/9999/musl-fixes.patch
|
||||
|
||||
@@ -75,6 +75,10 @@ src_prepare() {
|
||||
# https://bugs.gentoo.org/show_bug.cgi?id=565358
|
||||
eapply "${FILESDIR}"/9999/0007-llvm-config-Clean-up-exported-values-update-for-shar.patch
|
||||
|
||||
# Backport the fix for dlclose() causing option parser mess
|
||||
# e.g. https://bugs.gentoo.org/617154
|
||||
eapply "${FILESDIR}"/5.0.1/0001-cmake-Pass-Wl-z-nodelete-on-Linux-to-prevent-unloadi.patch
|
||||
|
||||
# disable use of SDK on OSX, bug #568758
|
||||
sed -i -e 's/xcrun/false/' utils/lit/lit/util.py || die
|
||||
|
||||
|
||||
@@ -75,6 +75,10 @@ src_prepare() {
|
||||
# https://bugs.gentoo.org/show_bug.cgi?id=565358
|
||||
eapply "${FILESDIR}"/9999/0007-llvm-config-Clean-up-exported-values-update-for-shar.patch
|
||||
|
||||
# Backport the fix for dlclose() causing option parser mess
|
||||
# e.g. https://bugs.gentoo.org/617154
|
||||
eapply "${FILESDIR}"/5.0.1/0001-cmake-Pass-Wl-z-nodelete-on-Linux-to-prevent-unloadi.patch
|
||||
|
||||
# disable use of SDK on OSX, bug #568758
|
||||
sed -i -e 's/xcrun/false/' utils/lit/lit/util.py || die
|
||||
|
||||
|
||||
Reference in New Issue
Block a user