@cryptotaxi247 / netdata-1 / commits / e90f3f4e2

enable libunwind in static builds (#19764)

* enable libunwind in static builds * add libunwind and backtrace to buildinfo * add linunwind to alpine packages * add -dev packages * add remove libunwind binary from the packages * Vendor libunwind in static builds instead of using a copy from the build environment. This is required to ensure that the C++ exception handling functionality in libunwind is _disabled_, because it does not play nice with static linking when using C++ with exception handling support enabled. * Remove changes from local testing. * Fix cross architecture builds. * Disable libunwind on 64-bit POWER builds. musl libc does not include functions that are required to build libunwind for this platform, so just disable it there for now. --------- Co-authored-by: Austin S. Hemmelgarn <austin@netdata.cloud>

Costa Tsaousis committed Mar 6, 2025 at 10:39 UTC e90f3f4e2214012c6c9875cde344354bc54335d8
6 files changed +105 -11
CMakeLists.txt
+13 -5
@@ -2263,16 +2263,24 @@ if(ENABLE_LIBUNWIND)
2263 if(TARGET PkgConfig::LIBUNWIND)
2264 set(HAVE_LIBUNWIND On)
2265
2266 + if(STATIC_BUILD)
2267 + set(unwind_prefix /libunwind-static/lib/libunwind-)
2268 + set(suffix ${CMAKE_STATIC_LIBRARY_SUFFIX})
2269 + else()
2270 + set(unwind_prefix -lunwind-)
2271 + set(suffix "")
2272 + endif()
2273 +
2274 if(CMAKE_SYSTEM_PROCESSOR MATCHES "(x86_64)|(amd64)")
2267 - target_link_libraries(libnetdata PUBLIC PkgConfig::LIBUNWIND -lunwind-x86_64)
2275 + target_link_libraries(libnetdata PUBLIC PkgConfig::LIBUNWIND ${unwind_prefix}x86_64${suffix})
2276 elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^i?.86")
2269 - target_link_libraries(libnetdata PUBLIC PkgConfig::LIBUNWIND -lunwind-x86)
2277 + target_link_libraries(libnetdata PUBLIC PkgConfig::LIBUNWIND ${unwind_prefix}x86${suffix})
2278 elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "(arm64)|(aarch64)")
2271 - target_link_libraries(libnetdata PUBLIC PkgConfig::LIBUNWIND -lunwind-aarch64)
2279 + target_link_libraries(libnetdata PUBLIC PkgConfig::LIBUNWIND ${unwind_prefix}aarch64${suffix})
2280 elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "arm")
2273 - target_link_libraries(libnetdata PUBLIC PkgConfig::LIBUNWIND -lunwind-arm)
2281 + target_link_libraries(libnetdata PUBLIC PkgConfig::LIBUNWIND ${unwind_prefix}arm${suffix})
2282 elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "p(ower)?pc64")
2275 - target_link_libraries(libnetdata PUBLIC PkgConfig::LIBUNWIND -lunwind-ppc64)
2283 + target_link_libraries(libnetdata PUBLIC PkgConfig::LIBUNWIND ${unwind_prefix}ppc64${suffix})
2284 else()
2285 message(WARNING "Unknown architecture ${CMAKE_SYSTEM_PROCESSOR} for libunwind. Stack traces may not work.")
2286 target_link_libraries(libnetdata PUBLIC PkgConfig::LIBUNWIND)
packaging/makeself/bundled-packages.version
+2
@@ -3,6 +3,8 @@ PACKAGES=("OPENSSL" "CURL" "BASH" "IOPING" "LIBNETFILTER_ACT")
3 SOURCE_TYPES=("GH_REPO_CLONE" "GH_REPO_CLONE" "DW_TARBALL" "GH_REPO_SOURCE" "DW_TARBALL")
4 OPENSSL_VERSION="openssl-3.4.0"
5 OPENSSL_SOURCE="https://github.com/openssl/openssl"
6 +LIBUNWIND_VERSION="177deb5f89c5d792c9618db54fdcebd260e271e8" # Should be updated to a stable version once https://github.com/libunwind/libunwind/issues/742 is fixed.
7 +LIBUNWIND_SOURCE="https://github.com/libunwind/libunwind"
8 CURL_VERSION="curl-8_11_1"
9 CURL_SOURCE="https://github.com/curl/curl"
10 BASH_VERSION="5.2.37"
packaging/makeself/install-alpine-packages.sh
+3 -2
@@ -32,6 +32,7 @@ apk add --no-cache -U \
32 lz4-static \
33 make \
34 ncurses \
35 + ncurses-dev \
36 netcat-openbsd \
37 openssh \
38 pkgconfig \
@@ -42,5 +43,5 @@ apk add --no-cache -U \
43 wget \
44 xz \
45 zlib-dev \
45 - zlib-static ||
46 - exit 1
46 + zlib-static \
47 + || exit 1
packaging/makeself/jobs/20-libunwind.install.sh new
+59
@@ -0,0 +1,59 @@
1 +#!/usr/bin/env bash
2 +# SPDX-License-Identifier: GPL-3.0-or-later
3 +
4 +# Can’t do libunwind on ppc64le with musl, so skip it.
5 +[ "${BUILDARCH}" = "ppc64le" ] && exit 0
6 +
7 +# shellcheck source=packaging/makeself/functions.sh
8 +. "$(dirname "${0}")/../functions.sh" "${@}" || exit 1
9 +# Source of truth for all the packages we bundle in static builds
10 +. "$(dirname "${0}")/../bundled-packages.version"
11 +# shellcheck disable=SC2015
12 +[ "${GITHUB_ACTIONS}" = "true" ] && echo "::group::Building libunwind" || true
13 +
14 +export CFLAGS="${TUNING_FLAGS} -fno-lto -pipe"
15 +export CXXFLAGS="${CFLAGS}"
16 +export LDFLAGS="-static"
17 +export PKG_CONFIG="pkg-config --static"
18 +
19 +if [ -d "${NETDATA_MAKESELF_PATH}/tmp/libunwind" ]; then
20 + rm -rf "${NETDATA_MAKESELF_PATH}/tmp/libunwind"
21 +fi
22 +
23 +cache="${NETDATA_SOURCE_PATH}/artifacts/cache/${BUILDARCH}/libunwind"
24 +
25 +if [ -d "${cache}" ]; then
26 + echo "Found cached copy of build directory for libunwind, using it."
27 + cp -a "${cache}/libunwind" "${NETDATA_MAKESELF_PATH}/tmp/"
28 + CACHE_HIT=1
29 +else
30 + echo "No cached copy of build directory for libunwind found, fetching sources instead."
31 + run git clone "${LIBUNWIND_SOURCE}" "${NETDATA_MAKESELF_PATH}/tmp/libunwind"
32 + cd "${NETDATA_MAKESELF_PATH}/tmp/libunwind" && run git checkout "${LIBUNWIND_VERSION}"
33 + CACHE_HIT=0
34 +fi
35 +
36 +cd "${NETDATA_MAKESELF_PATH}/tmp/libunwind" || exit 1
37 +
38 +if [ "${CACHE_HIT:-0}" -eq 0 ]; then
39 + run autoreconf -ivf
40 +
41 + run ./configure \
42 + --prefix=/libunwind-static \
43 + --build="$(gcc -dumpmachine)" \
44 + --disable-cxx-exceptions \
45 + --disable-documentation \
46 + --disable-tests \
47 + --disable-shared \
48 + --enable-static \
49 + --disable-dependency-tracking
50 +
51 + run make -j "$(nproc)"
52 +fi
53 +
54 +run make -j "$(nproc)" install
55 +
56 +store_cache libunwind "${NETDATA_MAKESELF_PATH}/tmp/libunwind"
57 +
58 +# shellcheck disable=SC2015
59 +[ "${GITHUB_ACTIONS}" = "true" ] && echo "::endgroup::" || true
packaging/makeself/jobs/70-netdata-git.install.sh
+5 -4
@@ -7,12 +7,12 @@
7 cd "${NETDATA_SOURCE_PATH}" || exit 1
8
9 if [ "${NETDATA_BUILD_WITH_DEBUG}" -eq 0 ]; then
10 - export CFLAGS="${TUNING_FLAGS} -ffunction-sections -fdata-sections -static -O2 -funroll-loops -DNETDATA_STATIC_BUILD=1 -I/openssl-static/include -I/libnetfilter-acct-static/include/libnetfilter_acct -I/curl-local/include/curl -I/usr/include/libmnl -pipe"
10 + export CFLAGS="${TUNING_FLAGS} -ffunction-sections -fdata-sections -static -O2 -funroll-loops -DNETDATA_STATIC_BUILD=1 -I/libunwind-static/include -I/openssl-static/include -I/libnetfilter-acct-static/include/libnetfilter_acct -I/curl-local/include/curl -I/usr/include/libmnl -pipe"
11 else
12 - export CFLAGS="${TUNING_FLAGS} -static -O1 -pipe -ggdb -Wall -Wextra -Wformat-signedness -DNETDATA_STATIC_BUILD=1 -DNETDATA_INTERNAL_CHECKS=1 -I/openssl-static/include -I/libnetfilter-acct-static/include/libnetfilter_acct -I/curl-local/include/curl -I/usr/include/libmnl"
12 + export CFLAGS="${TUNING_FLAGS} -static -O1 -pipe -ggdb -Wall -Wextra -Wformat-signedness -DNETDATA_STATIC_BUILD=1 -DNETDATA_INTERNAL_CHECKS=1 -I/libunwind-static/include -I/openssl-static/include -I/libnetfilter-acct-static/include/libnetfilter_acct -I/curl-local/include/curl -I/usr/include/libmnl"
13 fi
14
15 -export LDFLAGS="-Wl,--gc-sections -static -L/openssl-static/lib64 -L/libnetfilter-acct-static/lib -lnetfilter_acct -L/usr/lib -lmnl -L/usr/lib -lzstd -L/curl-local/lib"
15 +export LDFLAGS="-Wl,--gc-sections -static -L/libuwnind-static/lib -L/openssl-static/lib64 -L/libnetfilter-acct-static/lib -lnetfilter_acct -L/usr/lib -lmnl -L/usr/lib -lzstd -L/curl-local/lib"
16
17 # We export this to 'yes', installer sets this to .environment.
18 # The updater consumes this one, so that it can tell whether it should update a static install or a non-static one
@@ -21,11 +21,12 @@ export IS_NETDATA_STATIC_BINARY="yes"
21 # Set eBPF LIBC to "static" to bundle the `-static` variant of the kernel-collector
22 export EBPF_LIBC="static"
23 export PKG_CONFIG="pkg-config --static"
24 -export PKG_CONFIG_PATH="/openssl-static/lib64/pkgconfig:/libnetfilter-acct-static/lib/pkgconfig:/usr/lib/pkgconfig:/curl-local/lib/pkgconfig"
24 +export PKG_CONFIG_PATH="/libunwind-static/lib/pkgconfig:/openssl-static/lib64/pkgconfig:/libnetfilter-acct-static/lib/pkgconfig:/usr/lib/pkgconfig:/curl-local/lib/pkgconfig"
25
26 # Set correct CMake flags for building against non-System OpenSSL
27 # See: https://github.com/warmcat/libwebsockets/blob/master/READMEs/README.build.md
28 export CMAKE_FLAGS="-DOPENSSL_ROOT_DIR=/openssl-static -DOPENSSL_LIBRARIES=/openssl-static/lib64 -DCMAKE_INCLUDE_DIRECTORIES_PROJECT_BEFORE=/openssl-static -DLWS_OPENSSL_INCLUDE_DIRS=/openssl-static/include -DLWS_OPENSSL_LIBRARIES=/openssl-static/lib64/libssl.a;/openssl-static/lib64/libcrypto.a"
29 +[ "${BUILDARCH}" != "ppc64le" ] && export NETDATA_CMAKE_OPTIONS="-DENABLE_LIBUNWIND=ON"
30
31 run ./netdata-installer.sh \
32 --install-prefix "${NETDATA_INSTALL_PARENT}" \
src/daemon/buildinfo.c
+23
@@ -78,6 +78,8 @@ typedef enum __attribute__((packed)) {
78 BIB_LIB_LIBCRYPTO,
79 BIB_LIB_LIBYAML,
80 BIB_LIB_LIBMNL,
81 + BIB_LIB_LIBUNWIND,
82 + BIB_LIB_BACKTRACE,
83 BIB_PLUGIN_APPS,
84 BIB_PLUGIN_LINUX_CGROUPS,
85 BIB_PLUGIN_LINUX_CGROUP_NETWORK,
@@ -726,6 +728,22 @@ static struct {
728 .json = "libmnl",
729 .value = NULL,
730 },
731 + [BIB_LIB_LIBUNWIND] = {
732 + .category = BIC_LIBS,
733 + .type = BIT_BOOLEAN,
734 + .analytics = "libunwind",
735 + .print = "libunwind (library for getting stack traces)",
736 + .json = "libunwind",
737 + .value = NULL,
738 + },
739 + [BIB_LIB_BACKTRACE] = {
740 + .category = BIC_LIBS,
741 + .type = BIT_BOOLEAN,
742 + .analytics = "backtrace",
743 + .print = "backtrace (library for getting stack traces)",
744 + .json = "backtrace",
745 + .value = NULL,
746 + },
747 [BIB_PLUGIN_APPS] = {
748 .category = BIC_PLUGINS,
749 .type = BIT_BOOLEAN,
@@ -1269,6 +1287,11 @@ __attribute__((constructor)) void initialize_build_info(void) {
1287 #ifdef HAVE_LIBMNL
1288 build_info_set_status(BIB_LIB_LIBMNL, true);
1289 #endif
1290 +#ifdef HAVE_LIBUNWIND
1291 + build_info_set_status(BIB_LIB_LIBUNWIND, true);
1292 +#elif defined(HAVE_BACKTRACE)
1293 + build_info_set_status(BIB_LIB_BACKTRACE, true);
1294 +#endif
1295
1296 #ifdef ENABLE_PLUGIN_APPS
1297 build_info_set_status(BIB_PLUGIN_APPS, true);