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
This commit is contained in:
Harald van Dijk 2021-10-30 23:54:34 +01:00 committed by Lubomir Rintel
parent 73ac6dfb8a
commit 58bfcffd59
2 changed files with 24 additions and 9 deletions

View file

@ -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,

View file

@ -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