aboutsummaryrefslogtreecommitdiff
path: root/support
diff options
context:
space:
mode:
authorFlorian Weimer <fweimer@redhat.com>2025-03-21 10:33:25 +0100
committerFlorian Weimer <fweimer@redhat.com>2025-03-21 11:45:00 +0100
commit3e2be87832781a29ed67f38f87c1ce3dd4c1b866 (patch)
treef9d5c61f192bc28200b1628f6c2fb8116340679c /support
parent090dfa40a5e46f7c0e4d6e8369bcbbd51267625f (diff)
downloadglibc-3e2be87832781a29ed67f38f87c1ce3dd4c1b866.zip
glibc-3e2be87832781a29ed67f38f87c1ce3dd4c1b866.tar.gz
glibc-3e2be87832781a29ed67f38f87c1ce3dd4c1b866.tar.bz2
support: Link links-dso-program-c against libgcc_s
If C++ support is not available, links-dso-program-c is used instead of the C++ version. The C version was not linked against libgcc_s, which meant that thread cancellation and the backtrace function did not work in containers tests in that situation. Reviewed-by: Sam James <sam@gentoo.org>
Diffstat (limited to 'support')
-rw-r--r--support/Makefile2
-rw-r--r--support/links-dso-program-c.c20
2 files changed, 22 insertions, 0 deletions
diff --git a/support/Makefile b/support/Makefile
index 59a9974..0c67055 100644
--- a/support/Makefile
+++ b/support/Makefile
@@ -281,6 +281,8 @@ CFLAGS-temp_file.c += -D_FILE_OFFSET_BITS=64 -D_TIME_BITS=64
ifeq (,$(CXX))
LINKS_DSO_PROGRAM = links-dso-program-c
+CFLAGS-links-dso-program-c.c += -fexceptions
+LDLIBS-links-dso-program-c = -lgcc -lgcc_s $(libunwind)
else
LINKS_DSO_PROGRAM = links-dso-program
LDLIBS-links-dso-program = -lstdc++ -lgcc -lgcc_s $(libunwind)
diff --git a/support/links-dso-program-c.c b/support/links-dso-program-c.c
index 5fcbab2..efe65b4 100644
--- a/support/links-dso-program-c.c
+++ b/support/links-dso-program-c.c
@@ -1,4 +1,5 @@
#include <stdio.h>
+#include <dlfcn.h>
/* makedb needs selinux dso's. */
#ifdef HAVE_SELINUX
@@ -13,6 +14,20 @@
such dependencies.
*/
+/* Use attribute cleanup to force linking against libgcc_s. */
+static void
+cleanup_function (int *ignored)
+{
+ puts ("cleanup performed");
+}
+
+void
+invoke_callback (void (*callback) (int *))
+{
+ __attribute__ ((cleanup (cleanup_function))) int i = 0;
+ callback (&i);
+}
+
int
main (int argc, char **argv)
{
@@ -22,5 +37,10 @@ main (int argc, char **argv)
/* This exists to force libselinux.so to be required. */
printf ("selinux %d\n", is_selinux_enabled ());
#endif
+ /* Prevent invoke_callback from being optimized away. */
+ {
+ Dl_info dli;
+ dladdr (invoke_callback, &dli);
+ }
return 0;
}