summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2020-08-12 12:30:30 +0200
committerThomas Haller <thaller@redhat.com>2020-08-17 15:18:05 +0200
commitc92a3ca5c2cd5366714da916e4f31f606901b727 (patch)
tree9e3025cb668996e83f3d5e46b94b348bc7134482
parent54a1cfa97321c5990511a84f5a839e43fbb853d6 (diff)
downloadNetworkManager-c92a3ca5c2cd5366714da916e4f31f606901b727.tar.gz
build: fix generating "NetworkManager.ver" with LTO
We use a linker version script "NetworkManager.ver", to hide symbols from NetworkManager that are not used. That is important due to our habit of using internal helper libraries that we link statically everywhere, without handpicking the symbols we actually need. We want the tooling to get rid of unnecessary symbols. However, NetworkManager loads shared libraries for settings and device plugins. These libraries require symbols from the NetworkManager binary, but which one depends on build options. Hence, we also generate "NetworkManager.ver" by the "tools/create-exports-NetworkManager.sh" script. For that the script uses "nm" to find symbols that are undefined in the plugin libraries but defined in NetworkManager. With autotools the script looked at "./src/.libs/libNetworkManager.a" to find the present symbols. Note that for meson that already didn't work, and we build instead an intermediate NetworkManager binary first (with all symbols exposed). With LTO, "nm" doesn't find all symbols in "./src/.libs/libNetworkManager.a", and consequently they are not exported and dropped/hidden. This also causes unit tests to fail with LTO, because our test script "tools/check-exports.sh" catches such bugs. Fix that by also with autotools generate a complete "NetworkManager-all-sym" binary that is used to generate "NetworkManager.ver", before rebuilding "NetworkManager" again.
-rw-r--r--.gitignore1
-rw-r--r--Makefile.am21
-rw-r--r--src/meson.build6
-rwxr-xr-xtools/create-exports-NetworkManager.sh6
4 files changed, 25 insertions, 9 deletions
diff --git a/.gitignore b/.gitignore
index 919b1830c9..8c08337548 100644
--- a/.gitignore
+++ b/.gitignore
@@ -217,6 +217,7 @@ test-*.trs
/po/remove-potcdate.sin
/src/NetworkManager
+/src/NetworkManager-all-sym
/src/NetworkManager.ver
/src/devices/bluetooth/tests/nm-bt-test
/src/devices/tests/test-acd
diff --git a/Makefile.am b/Makefile.am
index 5841cbe72a..0f2f5da0f7 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -2406,7 +2406,26 @@ $(src_libNetworkManagerTest_la_OBJECTS): $(libnm_core_lib_h_pub_mkenums)
###############################################################################
-src/NetworkManager.ver: src/libNetworkManager.la $(core_plugins)
+noinst_PROGRAMS += src/NetworkManager-all-sym
+
+src_NetworkManager_all_sym_CPPFLAGS = $(src_cppflags)
+
+src_NetworkManager_all_sym_SOURCES = \
+ src/main.c
+
+src_NetworkManager_all_sym_LDADD = \
+ src/libNetworkManager.la \
+ $(GLIB_LIBS) \
+ $(NULL)
+
+src_NetworkManager_all_sym_LDFLAGS = \
+ -rdynamic \
+ $(SANITIZER_EXEC_LDFLAGS) \
+ $(NULL)
+
+$(src_NetworkManager_all_sym_OBJECTS): $(libnm_core_lib_h_pub_mkenums)
+
+src/NetworkManager.ver: src/NetworkManager-all-sym $(core_plugins)
$(AM_V_GEN) NM="$(NM)" "$(srcdir)/tools/create-exports-NetworkManager.sh" --called-from-build "$(srcdir)"
CLEANFILES += src/NetworkManager.ver
diff --git a/src/meson.build b/src/meson.build
index b2ea2ba0a1..5fc03d8d59 100644
--- a/src/meson.build
+++ b/src/meson.build
@@ -267,8 +267,8 @@ symbol_map_name = 'NetworkManager.ver'
# add dependencies with link_whole, only supported in meson >= 0.46.
# Create an executable with full symbols that we use in place of the
# library to enumerate the symbols.
-network_manager_sym = executable(
- 'nm-full-symbols',
+network_manager_all_sym = executable(
+ 'NetworkManager-all-sym',
'main.c',
dependencies: nm_deps,
c_args: daemon_c_flags,
@@ -280,7 +280,7 @@ network_manager_sym = executable(
ver_script = custom_target(
symbol_map_name,
output: symbol_map_name,
- depends: [network_manager_sym, core_plugins],
+ depends: [network_manager_all_sym, core_plugins],
command: [create_exports_networkmanager, '--called-from-build', source_root],
)
diff --git a/tools/create-exports-NetworkManager.sh b/tools/create-exports-NetworkManager.sh
index 47061f9dda..f439bd3112 100755
--- a/tools/create-exports-NetworkManager.sh
+++ b/tools/create-exports-NetworkManager.sh
@@ -40,11 +40,7 @@ call_nm() {
}
get_symbols_nm () {
- if [ -z "$from_meson" ]; then
- base=./src/.libs/libNetworkManager.a
- else
- base=./src/nm-full-symbols
- fi
+ base=./src/NetworkManager-all-sym
call_nm "$base" |
sed -n 's/^[tTDGRBS] //p' |
_sort