From caeccb7bec45f65bc89efa8195b3853368328361 Mon Sep 17 00:00:00 2001 From: Changqing Li Date: Mon, 17 Sep 2018 12:49:36 +0800 Subject: [PATCH] syslog-ng: fix segment fault during service start on arm64 service start failed since segment fault on arch arm64, syslog-ng have a submodule ivykis, from ivykis V0.42, it use pthread_atfork, but for arm64, this symbol is not included by libpthread, so cause segment fault. refer systemd, replace pthread_atfork with __register_atfork to fix this problem. I have create an issue, and this proposal to upstream. https://github.com/buytenh/ivykis/issues/15 Upstream-Status: Pending Signed-off-by: Changqing Li --- lib/ivykis/src/pthr.h | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/lib/ivykis/src/pthr.h b/lib/ivykis/src/pthr.h index a41eaf3..72c5190 100644 --- a/lib/ivykis/src/pthr.h +++ b/lib/ivykis/src/pthr.h @@ -24,6 +24,16 @@ #include #include +#ifdef __GLIBC__ +/* We use glibc __register_atfork() + __dso_handle directly here, as they are not included in the glibc + * headers. __register_atfork() is mostly equivalent to pthread_atfork(), but doesn't require us to link against + * libpthread, as it is part of glibc anyway. */ +extern int __register_atfork(void (*prepare) (void), void (*parent) (void), void (*child) (void), void * __dso_handle); +extern void* __dso_handle __attribute__ ((__weak__)); +#else +#define __register_atfork(prepare,parent,child,dso) pthread_atfork(prepare,parent,child) +#endif + #ifdef HAVE_PRAGMA_WEAK #pragma weak pthread_create #endif @@ -36,16 +46,7 @@ static inline int pthreads_available(void) #ifdef HAVE_PRAGMA_WEAK -/* - * On Linux, pthread_atfork() is defined in libpthread_nonshared.a, - * a static library, and we want to avoid "#pragma weak" for that - * symbol because that causes it to be undefined even if you link - * libpthread_nonshared.a in explicitly. - */ -#ifndef HAVE_LIBPTHREAD_NONSHARED -#pragma weak pthread_atfork -#endif - +#pragma weak __register_atfork #pragma weak pthread_create #pragma weak pthread_detach #pragma weak pthread_getspecific @@ -73,8 +74,7 @@ static inline int pthr_atfork(void (*prepare)(void), void (*parent)(void), void (*child)(void)) { if (pthreads_available()) - return pthread_atfork(prepare, parent, child); - + return __register_atfork(prepare, parent, child, __dso_handle); return ENOSYS; } -- 2.7.4