svn commit: r340395 - head/lib/csu/common
Andrew Turner
andrew at FreeBSD.org
Tue Nov 13 15:28:28 UTC 2018
Author: andrew
Date: Tue Nov 13 15:28:27 2018
New Revision: 340395
URL: https://svnweb.freebsd.org/changeset/base/340395
Log:
Run __cxa_finalize in shared objects in the destructor path.
When we have .dtors call them before .dtor handling, otherwise call from
a destructor.
PR: 233056
MFC with: r339738
Sponsored by: DARPA, AFRL
Modified:
head/lib/csu/common/crtbegin.c
Modified: head/lib/csu/common/crtbegin.c
==============================================================================
--- head/lib/csu/common/crtbegin.c Tue Nov 13 13:57:15 2018 (r340394)
+++ head/lib/csu/common/crtbegin.c Tue Nov 13 15:28:27 2018 (r340395)
@@ -32,12 +32,29 @@ typedef void (*crt_func)(void);
extern void *__dso_handle __hidden;
-#ifdef SHARED
-void *__dso_handle = &__dso_handle;
-#else
+#ifndef SHARED
void *__dso_handle = 0;
+#else
+void *__dso_handle = &__dso_handle;
+void __cxa_finalize(void *) __weak_symbol;
+
+/*
+ * Call __cxa_finalize with the dso handle in shared objects.
+ * When we have ctors/dtors call from the dtor handler before calling
+ * any dtors, otherwise use a destructor.
+ */
+#ifndef HAVE_CTORS
+__attribute__((destructor))
#endif
+static void
+run_cxa_finalize(void)
+{
+ if (__cxa_finalize != NULL)
+ __cxa_finalize(__dso_handle);
+}
+#endif
+
/*
* On some architectures and toolchains we may need to call the .dtors.
* These are called in the order they are in the ELF file.
@@ -57,6 +74,10 @@ __do_global_dtors_aux(void)
{
crt_func fn;
int n;
+
+#ifdef SHARED
+ run_cxa_finalize();
+#endif
for (n = 1;; n++) {
fn = __DTOR_LIST__[n];
More information about the svn-src-all
mailing list