From 58bfcffd59a30ec17dbeaae30e00353108ca2e29 Mon Sep 17 00:00:00 2001 From: Harald van Dijk Date: Sat, 30 Oct 2021 23:54:34 +0100 Subject: [PATCH] core: support linking with LLD 13 LLD 13 adds -z start-stop-gc and makes it the default, resulting in: CCLD src/core/NetworkManager-all-sym ld.lld: error: undefined symbol: __stop_connection_defaults >>> referenced by nm-config.c:0 (src/core/nm-config.c:0) >>> libNetworkManager_la-nm-config.o:(read_config) in archive src/core/.libs/libNetworkManager.a >>> referenced by nm-config-data.c:1598 (src/core/nm-config-data.c:1598) >>> libNetworkManager_la-nm-config-data.o:(nm_config_data_get_connection_default) in archive src/core/.libs/libNetworkManager.a >>> referenced by nm-config-data.c:0 (src/core/nm-config-data.c:0) >>> libNetworkManager_la-nm-config-data.o:(nm_config_data_get_connection_default) in archive src/core/.libs/libNetworkManager.a ld.lld: error: undefined symbol: __start_connection_defaults >>> referenced by nm-config.c:0 (src/core/nm-config.c:0) >>> libNetworkManager_la-nm-config.o:(read_config) in archive src/core/.libs/libNetworkManager.a >>> referenced by nm-config.c:0 (src/core/nm-config.c:0) >>> libNetworkManager_la-nm-config.o:(read_config) in archive src/core/.libs/libNetworkManager.a >>> referenced by nm-config.c:0 (src/core/nm-config.c:0) >>> libNetworkManager_la-nm-config.o:(read_config) in archive src/core/.libs/libNetworkManager.a >>> referenced 2 more times clang: error: linker command failed with exit code 1 (use -v to see invocation) Add __attribute__((__retain__)) to prevent GC of the connection defaults. https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/1008 --- src/core/nm-config-data.h | 18 +++++++++--------- src/libnm-std-aux/nm-std-aux.h | 15 +++++++++++++++ 2 files changed, 24 insertions(+), 9 deletions(-) diff --git a/src/core/nm-config-data.h b/src/core/nm-config-data.h index fa58d869c7..92a7cb5c6f 100644 --- a/src/core/nm-config-data.h +++ b/src/core/nm-config-data.h @@ -195,16 +195,16 @@ const char *nm_config_data_get_iwd_config_path(const NMConfigData *self); extern const char *__start_connection_defaults[]; extern const char *__stop_connection_defaults[]; -#define NM_CON_DEFAULT_NOP(name) \ - static const char *NM_UNIQ_T(connection_default, NM_UNIQ) \ - _nm_used _nm_section("connection_defaults") = "" name +#define NM_CON_DEFAULT_NOP(name) \ + static const char * NM_UNIQ_T(connection_default, NM_UNIQ) \ + _nm_used _nm_retain _nm_section("connection_defaults") = "" name -#define NM_CON_DEFAULT(name) \ - ({ \ - static const char *__con_default_prop _nm_used _nm_section("connection_defaults") = \ - "" name; \ - \ - name; \ +#define NM_CON_DEFAULT(name) \ + ({ \ + static const char *__con_default_prop _nm_used _nm_retain _nm_section( \ + "connection_defaults") = "" name; \ + \ + name; \ }) const char *nm_config_data_get_connection_default(const NMConfigData *self, diff --git a/src/libnm-std-aux/nm-std-aux.h b/src/libnm-std-aux/nm-std-aux.h index ce4d06d25b..b79b1c6533 100644 --- a/src/libnm-std-aux/nm-std-aux.h +++ b/src/libnm-std-aux/nm-std-aux.h @@ -26,6 +26,21 @@ #define _nm_alignof(type) __alignof(type) #define _nm_alignas(type) _nm_align(_nm_alignof(type)) #define _nm_deprecated(msg) __attribute__((__deprecated__(msg))) +#define _nm_retain + +#if defined(__clang__) && defined(__has_attribute) +#if __has_attribute(__retain__) +/* __attribute__((__retain__)) is supported in clang 13+, but is warned about + * as an unknown attribute in older versions. We assume older versions are used + * together with linkers that do not require the attribute. + * + * Ideally __has_attribute(__retain__) would be checked in other compilers as + * well, but it is broken in GCC (bug 99587). Limit it to clang for now, as it + * is only known to be needed for linking lld. */ +#undef _nm_retain +#define _nm_retain __attribute__((__retain__)) +#endif +#endif #if defined(__clang__) && __clang_major__ == 13 /* Clang 13 can emit -Wunused-but-set-variable warning for cleanup variables