Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 27 Jul 2019 14:22:16 +0000
From:      bugzilla-noreply@freebsd.org
To:        threads@FreeBSD.org
Subject:   [Bug 239475] Linking libthr with -nodefaultlibs statically can cause infinite recursion
Message-ID:  <bug-239475-13406-hGVAaFfGl8@https.bugs.freebsd.org/bugzilla/>
In-Reply-To: <bug-239475-13406@https.bugs.freebsd.org/bugzilla/>
References:  <bug-239475-13406@https.bugs.freebsd.org/bugzilla/>

next in thread | previous in thread | raw e-mail | index | archive | help
https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=3D239475

Konstantin Belousov <kib@FreeBSD.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |kib@FreeBSD.org

--- Comment #1 from Konstantin Belousov <kib@FreeBSD.org> ---
For me it was reproduced as infinite loop, perhaps due to the the tail call
elimination.  The issue is that when -lc is passed first,
__pthread_cleanup_push_imp is found in libc, and then the libthr jump table,
which references the symbol, is satisfied with the same libc definition.

Try this, I did not even compiled with the patch.  It might require some
additional tweaking to get the stuff actually working.

diff --git a/lib/libthr/thread/thr_clean.c b/lib/libthr/thread/thr_clean.c
index 5a93d94a7e5..7bc7d62b617 100644
--- a/lib/libthr/thread/thr_clean.c
+++ b/lib/libthr/thread/thr_clean.c
@@ -49,6 +49,10 @@ __FBSDID("$FreeBSD$");
 __weak_reference(_pthread_cleanup_push, pthread_cleanup_push);
 __weak_reference(_pthread_cleanup_pop, pthread_cleanup_pop);

+/* help static linking when libc symbols have preference */
+__weak_reference(__pthread_cleanup_push_imp, __pthread_cleanup_push_imp1);
+__weak_reference(__pthread_cleanup_pop_imp, pthread_cleanup_pop_imp1);
+
 void
 __pthread_cleanup_push_imp(void (*routine)(void *), void *arg,
        struct _pthread_cleanup_info *info)
diff --git a/lib/libthr/thread/thr_init.c b/lib/libthr/thread/thr_init.c
index 7b043a38b1f..22802c0ae1a 100644
--- a/lib/libthr/thread/thr_init.c
+++ b/lib/libthr/thread/thr_init.c
@@ -202,6 +202,10 @@ STATIC_LIB_REQUIRE(_thread_state_running);
 #define        DUAL_ENTRY(entry)       \
        (pthread_func_t)entry, (pthread_func_t)entry

+void __pthread_cleanup_push_imp1(void (*)(void *), void *,
+    struct _pthread_cleanup_info *);
+void __pthread_cleanup_pop_imp1(int);
+
 static pthread_func_t jmp_table[][2] =3D {
        {DUAL_ENTRY(_pthread_atfork)},  /* PJT_ATFORK */
        {DUAL_ENTRY(_pthread_attr_destroy)},    /* PJT_ATTR_DESTROY */
@@ -265,8 +269,8 @@ static pthread_func_t jmp_table[][2] =3D {
        {DUAL_ENTRY(_pthread_setspecific)},     /* PJT_SETSPECIFIC */
        {DUAL_ENTRY(_pthread_sigmask)},         /* PJT_SIGMASK */
        {DUAL_ENTRY(_pthread_testcancel)},      /* PJT_TESTCANCEL */
-       {DUAL_ENTRY(__pthread_cleanup_pop_imp)},/* PJT_CLEANUP_POP_IMP */
-       {DUAL_ENTRY(__pthread_cleanup_push_imp)},/* PJT_CLEANUP_PUSH_IMP */
+       {DUAL_ENTRY(__pthread_cleanup_pop_imp1)},/* PJT_CLEANUP_POP_IMP */
+       {DUAL_ENTRY(__pthread_cleanup_push_imp1)},/* PJT_CLEANUP_PUSH_IMP */
        {DUAL_ENTRY(_pthread_cancel_enter)},    /* PJT_CANCEL_ENTER */
        {DUAL_ENTRY(_pthread_cancel_leave)},    /* PJT_CANCEL_LEAVE */
        {DUAL_ENTRY(_pthread_mutex_consistent)},/* PJT_MUTEX_CONSISTENT */

--=20
You are receiving this mail because:
You are the assignee for the bug.=



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?bug-239475-13406-hGVAaFfGl8>