https://gitlab.freedesktop.org/pipewire/pipewire/-/commit/e28a052105f8ef35b3f469d3b85e1fcb25106f26

From e28a052105f8ef35b3f469d3b85e1fcb25106f26 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Barnab=C3=A1s=20P=C5=91cze?= <pobrn@protonmail.com>
Date: Wed, 13 Apr 2022 18:13:12 +0200
Subject: [PATCH] treewide: retain sections to prevent linker garbage
 collection

The linker may remove sections that are actually used when
"--gc-sections" and "-z start-stop-gc" is set. Add the `retain`
attribute to prevent that.

Furthermore, fix the alignment for `pwtest_suite_decl` objects.

See: #2292
See: https://lld.llvm.org/ELF/start-stop-gc.html
See: https://github.com/systemd/systemd/issues/21847
See: https://github.com/systemd/systemd/pull/21855
---
 src/modules/module-protocol-pulse/module.h | 1 +
 test/pwtest-implementation.h               | 2 +-
 test/pwtest.h                              | 6 ++++--
 3 files changed, 6 insertions(+), 3 deletions(-)

diff --git a/src/modules/module-protocol-pulse/module.h b/src/modules/module-protocol-pulse/module.h
index c1153640e..f75d8786c 100644
--- a/src/modules/module-protocol-pulse/module.h
+++ b/src/modules/module-protocol-pulse/module.h
@@ -47,6 +47,7 @@ struct module_info {
 
 #define DEFINE_MODULE_INFO(name)					\
 	__attribute__((used))						\
+	__attribute__((retain))						\
 	__attribute__((section("pw_mod_pulse_modules")))		\
 	__attribute__((aligned(__alignof__(struct module_info))))	\
 	const struct module_info name
diff --git a/test/pwtest-implementation.h b/test/pwtest-implementation.h
index 7bfad01cf..1525d2056 100644
--- a/test/pwtest-implementation.h
+++ b/test/pwtest-implementation.h
@@ -131,7 +131,7 @@ void _pwtest_add(struct pwtest_context *ctx,
 struct pwtest_suite_decl {
 	const char *name;
 	enum pwtest_result (*setup)(struct pwtest_context *, struct pwtest_suite *);
-} __attribute__((aligned(16)));
+};
 
 
 #endif /* PWTEST_IMPLEMENTATION_H */
diff --git a/test/pwtest.h b/test/pwtest.h
index 9c0737523..6d3070b79 100644
--- a/test/pwtest.h
+++ b/test/pwtest.h
@@ -494,9 +494,11 @@ enum pwtest_arg {
  */
 #define PWTEST_SUITE(cname) \
 	static enum pwtest_result (cname##__setup)(struct pwtest_context *ctx, struct pwtest_suite *suite); \
-	static const struct pwtest_suite_decl _test_suite \
 	__attribute__((used)) \
-	__attribute((section("pwtest_suite_section"))) = { \
+	__attribute__((retain)) \
+	__attribute__((section("pwtest_suite_section"))) \
+	__attribute__((aligned(__alignof__(struct pwtest_suite_decl)))) \
+	static const struct pwtest_suite_decl _test_suite = { \
 	   .name = #cname, \
 	   .setup = cname##__setup, \
 	}; \
-- 
GitLab

