diff --git a/language-extensions/python/src/CMakeLists.txt b/language-extensions/python/src/CMakeLists.txt index 7f54e18b..db9605f5 100644 --- a/language-extensions/python/src/CMakeLists.txt +++ b/language-extensions/python/src/CMakeLists.txt @@ -54,7 +54,10 @@ if (${PLATFORM} STREQUAL linux) target_compile_options(PythonExtension PRIVATE -Wall -Wextra -g -O2 -fPIC -Werror -std=c++17 -Wno-unused-parameter -Wno-maybe-uninitialized -fshort-wchar) - set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--as-needed -Wl,--export-dynamic -fopenmp") + # Static-link libstdc++/libgcc so libPythonExtension.so does not require a newer system + # GLIBCXX at load time (RHEL9 ships libstdc++ without GLIBCXX_3.4.32). --exclude-libs,ALL + # localizes the statically-linked symbols so they do not interpose the C++ host runtime. + set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--as-needed -Wl,--export-dynamic -fopenmp -static-libstdc++ -static-libgcc -Wl,--exclude-libs,ALL") # Prefer shared libraries over static libraries set(CMAKE_FIND_LIBRARY_SUFFIXES .so .so.1.0 ${CMAKE_FIND_LIBRARY_SUFFIXES}) @@ -72,8 +75,10 @@ if (${PLATFORM} STREQUAL linux) message(STATUS "Shared Python library not found in standard locations, trying system default search") find_library(PYTHON_LIB python${PYTHON_VERSION}) endif() - find_library(BOOST_PYTHON_LIB boost_python${PYTHON_VERSION_NO_DOT} ${BOOST_PYTHON_ROOT}) - find_library(BOOST_NUMPY_LIB boost_numpy${PYTHON_VERSION_NO_DOT} ${BOOST_PYTHON_ROOT}) + # Static-link Boost.Python/Boost.NumPy from the from-source boost root so + # libPythonExtension.so is self-contained (no external boost .so; portable across distros). + find_library(BOOST_PYTHON_LIB NAMES libboost_python${PYTHON_VERSION_NO_DOT}.a PATHS ${BOOST_PYTHON_ROOT} NO_DEFAULT_PATH) + find_library(BOOST_NUMPY_LIB NAMES libboost_numpy${PYTHON_VERSION_NO_DOT}.a PATHS ${BOOST_PYTHON_ROOT} NO_DEFAULT_PATH) file(TO_CMAKE_PATH ${INCLUDE_ROOT}/python${PYTHON_VERSION} PYTHON_INCLUDE) file(TO_CMAKE_PATH ${INCLUDE_ROOT}/boost BOOST_INCLUDE) diff --git a/restore-packages.sh b/restore-packages.sh index 0ba1ca30..862a4c84 100644 --- a/restore-packages.sh +++ b/restore-packages.sh @@ -6,9 +6,13 @@ apt-get -q -y install unixodbc-dev apt-get update -y apt-get install build-essential software-properties-common -y -apt-get install gcc-13 g++-13 -y +# Use GCC 11 (native on the Ubuntu 22.04 build image) so the extension links against +# GLIBCXX_3.4.29 / glibc 2.35 and stays loadable on RHEL9 (glibc 2.34). GCC 13 emitted +# GLIBCXX_3.4.32 and glibc 2.38 symbol references (_dl_find_object, arc4random, +# __isoc23_*) that RHEL9 cannot satisfy, so libPythonExtension.so failed to load there. +apt-get install gcc-11 g++-11 -y apt-get install cmake -y -update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-13 70 --slave /usr/bin/g++ g++ /usr/bin/g++-13 +update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-11 70 --slave /usr/bin/g++ g++ /usr/bin/g++-11 exit $?