diff options
author | Florian Weimer <fweimer@redhat.com> | 2025-03-21 10:33:25 +0100 |
---|---|---|
committer | Florian Weimer <fweimer@redhat.com> | 2025-03-21 11:45:00 +0100 |
commit | 3e2be87832781a29ed67f38f87c1ce3dd4c1b866 (patch) | |
tree | f9d5c61f192bc28200b1628f6c2fb8116340679c /support | |
parent | 090dfa40a5e46f7c0e4d6e8369bcbbd51267625f (diff) | |
download | glibc-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/Makefile | 2 | ||||
-rw-r--r-- | support/links-dso-program-c.c | 20 |
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; } |