From c4681ac428fa4b63a2c9ce18bb3da4cddc14e439 Mon Sep 17 00:00:00 2001 From: Zebediah Figura Date: Wed, 24 Mar 2021 14:20:18 -0500 Subject: [PATCH] meson: Build with -Wl,-z,nodelete to prevent unloading of dynamic libraries and plugins GLib made the unfortunate decision to prevent libgobject from ever being unloaded, which means that now any library which registers a static type can't ever be unloaded either (and any library that depends on those, ad nauseam). Part-of: --- subprojects/gst-devtools/meson.build | 6 ++++++ subprojects/gst-editing-services/meson.build | 6 ++++++ subprojects/gst-libav/meson.build | 6 ++++++ subprojects/gst-omx/meson.build | 6 ++++++ subprojects/gst-plugins-bad/meson.build | 9 +++++++++ subprojects/gst-plugins-base/meson.build | 6 ++++++ subprojects/gst-plugins-good/meson.build | 19 +++++++++++++++---- subprojects/gst-plugins-ugly/meson.build | 9 +++++++++ subprojects/gst-rtsp-server/meson.build | 6 ++++++ subprojects/gstreamer/meson.build | 6 ++++++ 10 files changed, 75 insertions(+), 4 deletions(-) diff --git a/subprojects/gst-devtools/meson.build b/subprojects/gst-devtools/meson.build index 513daff440..fc7205e8d7 100644 --- a/subprojects/gst-devtools/meson.build +++ b/subprojects/gst-devtools/meson.build @@ -63,6 +63,12 @@ else noseh_link_args = [] endif +# glib doesn't support unloading, which means that unloading and reloading +# any library that registers static types will fail +if cc.has_link_argument('-Wl,-z,nodelete') + add_project_link_arguments('-Wl,-z,nodelete', language: 'c') +endif + # Symbol visibility if cc.has_argument('-fvisibility=hidden') add_project_arguments('-fvisibility=hidden', language: 'c') diff --git a/subprojects/gst-editing-services/meson.build b/subprojects/gst-editing-services/meson.build index e45541c812..b035dacb90 100644 --- a/subprojects/gst-editing-services/meson.build +++ b/subprojects/gst-editing-services/meson.build @@ -67,6 +67,12 @@ if cc.has_link_argument('-Wl,-Bsymbolic-functions') add_project_link_arguments('-Wl,-Bsymbolic-functions', language : 'c') endif +# glib doesn't support unloading, which means that unloading and reloading +# any library that registers static types will fail +if cc.has_link_argument('-Wl,-z,nodelete') + add_project_link_arguments('-Wl,-z,nodelete', language: 'c') +endif + # Symbol visibility if cc.get_id() == 'msvc' export_define = '__declspec(dllexport) extern' diff --git a/subprojects/gst-libav/meson.build b/subprojects/gst-libav/meson.build index e2a3fa5d3c..1cdd33c5b3 100644 --- a/subprojects/gst-libav/meson.build +++ b/subprojects/gst-libav/meson.build @@ -140,6 +140,12 @@ if cc.get_id() == 'msvc' add_project_arguments(msvc_args, language: ['c', 'cpp']) endif +# glib doesn't support unloading, which means that unloading and reloading +# any library that registers static types will fail +if cc.has_link_argument('-Wl,-z,nodelete') + add_project_link_arguments('-Wl,-z,nodelete', language: 'c') +endif + # Symbol visibility if cc.has_argument('-fvisibility=hidden') add_project_arguments('-fvisibility=hidden', language: 'c') diff --git a/subprojects/gst-omx/meson.build b/subprojects/gst-omx/meson.build index 915538844a..d1b149d997 100644 --- a/subprojects/gst-omx/meson.build +++ b/subprojects/gst-omx/meson.build @@ -49,6 +49,12 @@ else noseh_link_args = [] endif +# glib doesn't support unloading, which means that unloading and reloading +# any library that registers static types will fail +if cc.has_link_argument('-Wl,-z,nodelete') + add_project_link_arguments('-Wl,-z,nodelete', language: 'c') +endif + cdata = configuration_data() check_headers = [ # ['HAVE_DLFCN_H', 'dlfcn.h'], diff --git a/subprojects/gst-plugins-bad/meson.build b/subprojects/gst-plugins-bad/meson.build index 38472220f3..90098a1276 100644 --- a/subprojects/gst-plugins-bad/meson.build +++ b/subprojects/gst-plugins-bad/meson.build @@ -102,6 +102,15 @@ if cc.has_link_argument('-Wl,-Bsymbolic-functions') add_project_link_arguments('-Wl,-Bsymbolic-functions', language : 'c') endif +# glib doesn't support unloading, which means that unloading and reloading +# any library that registers static types will fail +if cc.has_link_argument('-Wl,-z,nodelete') + add_project_link_arguments('-Wl,-z,nodelete', language: 'c') +endif +if cxx.has_link_argument('-Wl,-z,nodelete') + add_project_link_arguments('-Wl,-z,nodelete', language: 'cpp') +endif + # Symbol visibility if cc.get_id() == 'msvc' export_define = '__declspec(dllexport) extern' diff --git a/subprojects/gst-plugins-base/meson.build b/subprojects/gst-plugins-base/meson.build index 13b68fe807..451ee15769 100644 --- a/subprojects/gst-plugins-base/meson.build +++ b/subprojects/gst-plugins-base/meson.build @@ -95,6 +95,12 @@ if cc.has_link_argument('-Wl,-Bsymbolic-functions') add_project_link_arguments('-Wl,-Bsymbolic-functions', language : 'c') endif +# glib doesn't support unloading, which means that unloading and reloading +# any library that registers static types will fail +if cc.has_link_argument('-Wl,-z,nodelete') + add_project_link_arguments('-Wl,-z,nodelete', language: 'c') +endif + core_conf = configuration_data() core_conf.set('ENABLE_NLS', 1) diff --git a/subprojects/gst-plugins-good/meson.build b/subprojects/gst-plugins-good/meson.build index 97ab9a3981..97a3863e74 100644 --- a/subprojects/gst-plugins-good/meson.build +++ b/subprojects/gst-plugins-good/meson.build @@ -18,6 +18,9 @@ gst_version_is_stable = gst_version_minor.is_even() gst_version_is_dev = gst_version_minor.is_odd() and gst_version_micro < 90 have_cxx = add_languages('cpp', native: false, required: false) +if have_cxx + cxx = meson.get_compiler('cpp') +endif glib_req = '>= 2.62.0' orc_req = '>= 0.4.17' @@ -84,6 +87,18 @@ endif if cc.has_link_argument('-Wl,-Bsymbolic-functions') add_project_link_arguments('-Wl,-Bsymbolic-functions', language : 'c') endif +if have_cxx and cxx.has_link_argument('-Wl,-Bsymbolic-functions') + add_project_link_arguments('-Wl,-Bsymbolic-functions', language : 'cpp') +endif + +# glib doesn't support unloading, which means that unloading and reloading +# any library that registers static types will fail +if cc.has_link_argument('-Wl,-z,nodelete') + add_project_link_arguments('-Wl,-z,nodelete', language: 'c') +endif +if have_cxx and cxx.has_link_argument('-Wl,-z,nodelete') + add_project_link_arguments('-Wl,-z,nodelete', language: 'cpp') +endif # Symbol visibility if cc.has_argument('-fvisibility=hidden') @@ -234,10 +249,6 @@ warning_c_flags = [ '-Waggregate-return', ] -if have_cxx - cxx = meson.get_compiler('cpp') -endif - foreach extra_arg : warning_flags if cc.has_argument (extra_arg) add_project_arguments([extra_arg], language: 'c') diff --git a/subprojects/gst-plugins-ugly/meson.build b/subprojects/gst-plugins-ugly/meson.build index 135dd49827..c9fe6ba8d1 100644 --- a/subprojects/gst-plugins-ugly/meson.build +++ b/subprojects/gst-plugins-ugly/meson.build @@ -89,6 +89,15 @@ if have_cxx and cxx.has_link_argument('-Wl,-Bsymbolic-functions') add_project_link_arguments('-Wl,-Bsymbolic-functions', language : 'cpp') endif +# glib doesn't support unloading, which means that unloading and reloading +# any library that registers static types will fail +if cc.has_link_argument('-Wl,-z,nodelete') + add_project_link_arguments('-Wl,-z,nodelete', language: 'c') +endif +if have_cxx and cxx.has_link_argument('-Wl,-z,nodelete') + add_project_link_arguments('-Wl,-z,nodelete', language: 'cpp') +endif + cdata = configuration_data() cdata.set('ENABLE_NLS', 1) diff --git a/subprojects/gst-rtsp-server/meson.build b/subprojects/gst-rtsp-server/meson.build index 0de2bad636..df41235755 100644 --- a/subprojects/gst-rtsp-server/meson.build +++ b/subprojects/gst-rtsp-server/meson.build @@ -42,6 +42,12 @@ if cc.has_link_argument('-Wl,-Bsymbolic-functions') add_project_link_arguments('-Wl,-Bsymbolic-functions', language : 'c') endif +# glib doesn't support unloading, which means that unloading and reloading +# any library that registers static types will fail +if cc.has_link_argument('-Wl,-z,nodelete') + add_project_link_arguments('-Wl,-z,nodelete', language: 'c') +endif + # Symbol visibility if cc.get_id() == 'msvc' export_define = '__declspec(dllexport) extern' diff --git a/subprojects/gstreamer/meson.build b/subprojects/gstreamer/meson.build index de453c8b5e..85e36ef9c8 100644 --- a/subprojects/gstreamer/meson.build +++ b/subprojects/gstreamer/meson.build @@ -74,6 +74,12 @@ elif cc.has_link_argument('-Wl,-Bsymbolic-functions') add_project_link_arguments('-Wl,-Bsymbolic-functions', language : 'c') endif +# glib doesn't support unloading, which means that unloading and reloading +# any library that registers static types will fail +if cc.has_link_argument('-Wl,-z,nodelete') + add_project_link_arguments('-Wl,-z,nodelete', language: 'c') +endif + # Symbol visibility have_visibility_hidden = false if cc.get_id() == 'msvc'