From 684f2acffea3ed5704330bff05b87acbf371ccdd Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Wed, 21 Jul 2021 22:18:32 +0200 Subject: [PATCH] build: add way to keep unused symbols when linking NetworkManager NetworkManager (and NetworkManager-all-sym) must not only contain symbols that are used by itself. Also the device and settings plugin are dlopen'd by NetworkManager and use symobls form the binary. That means, if a symbols is only used by a plugin, then we must make sure that the linker keeps it in the binary. Add a mechanism for that. --- Makefile.am | 8 ++++++++ src/core/meson.build | 14 ++++++++++++-- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/Makefile.am b/Makefile.am index 659dc054f1..af327de094 100644 --- a/Makefile.am +++ b/Makefile.am @@ -2656,6 +2656,12 @@ $(src_core_libNetworkManagerTest_la_OBJECTS): $(src_libnm_core_public_mkenums_h) ############################################################################### +# NetworkManager binary also must contain symbols that are not used by the binary +# itself, but by the plugins (that are dlopened). We need to explicitly include +# them during linking. +networkmanager_undefined_symbols = \ + $(NULL) + noinst_PROGRAMS += src/core/NetworkManager-all-sym src_core_NetworkManager_all_sym_CPPFLAGS = $(src_core_cppflags) @@ -2670,6 +2676,7 @@ src_core_NetworkManager_all_sym_LDADD = \ src_core_NetworkManager_all_sym_LDFLAGS = \ -rdynamic \ + $(networkmanager_undefined_symbols:%=-u %) \ $(SANITIZER_EXEC_LDFLAGS) \ $(NULL) @@ -2696,6 +2703,7 @@ src_core_NetworkManager_LDADD = \ src_core_NetworkManager_LDFLAGS = \ -rdynamic \ -Wl,--version-script="src/core/NetworkManager.ver" \ + $(networkmanager_undefined_symbols:%=-u %) \ $(SANITIZER_EXEC_LDFLAGS) \ $(NULL) diff --git a/src/core/meson.build b/src/core/meson.build index f4d7af6407..1ce641d6d8 100644 --- a/src/core/meson.build +++ b/src/core/meson.build @@ -270,6 +270,14 @@ endif subdir('devices') subdir('settings/plugins') +# NetworkManager binary also must contain symbols that are not used by the binary +# itself, but by the plugins (that are dlopened). We need to explicitly include +# them during linking. +networkmanager_undefined_symbols_args = [] +foreach s: [] + networkmanager_undefined_symbols_args += ['-u', s] +endforeach + # NetworkManager binary # libNetworkManager.a, as built by meson doesn't contain all symbols @@ -284,7 +292,9 @@ NetworkManager_all_sym = executable( nm_deps, libudev_dep, ], - link_args: '-Wl,--no-gc-sections', + link_args: [ + '-Wl,--no-gc-sections', + ] + networkmanager_undefined_symbols_args, link_whole: [ libNetworkManager, libNetworkManagerBase, @@ -345,7 +355,7 @@ NetworkManager = executable( link_args: [ '-rdynamic', '-Wl,--version-script,@0@'.format(ver_script.full_path()), - ], + ] + networkmanager_undefined_symbols_args, link_depends: ver_script, install: true, install_dir: nm_sbindir,