From 26fd740d9c3b81246f19f5b9832b0ecd07add17c Mon Sep 17 00:00:00 2001 From: Alexandre Julliard Date: Tue, 22 Oct 2002 00:44:24 +0000 Subject: [PATCH] Avoid reference to glibc internal __libc_fork function. --- configure | 2 -- configure.ac | 1 - include/config.h.in | 3 -- scheduler/pthread.c | 67 ++++++++++++++++++++------------------------- 4 files changed, 30 insertions(+), 43 deletions(-) diff --git a/configure b/configure index fc156661885..79913775a13 100755 --- a/configure +++ b/configure @@ -11457,11 +11457,9 @@ fi - for ac_func in \ - __libc_fork \ _lwp_create \ _pclose \ _popen \ diff --git a/configure.ac b/configure.ac index 6fb55890812..7cfedc76373 100644 --- a/configure.ac +++ b/configure.ac @@ -909,7 +909,6 @@ dnl **** Check for functions **** AC_FUNC_ALLOCA() AC_CHECK_FUNCS(\ - __libc_fork \ _lwp_create \ _pclose \ _popen \ diff --git a/include/config.h.in b/include/config.h.in index 751cf86eb99..5a8605b2b7a 100644 --- a/include/config.h.in +++ b/include/config.h.in @@ -650,9 +650,6 @@ /* Define to 1 if you have the `_strnicmp' function. */ #undef HAVE__STRNICMP -/* Define to 1 if you have the `__libc_fork' function. */ -#undef HAVE___LIBC_FORK - /* Define if we have __va_copy */ #undef HAVE___VA_COPY diff --git a/scheduler/pthread.c b/scheduler/pthread.c index 3086b5698f3..a82d3b57800 100644 --- a/scheduler/pthread.c +++ b/scheduler/pthread.c @@ -38,13 +38,6 @@ #include "thread.h" #include "winternl.h" -static int init_done; - -void PTHREAD_init_done(void) -{ - init_done = 1; -} - /* Currently this probably works only for glibc2, * which checks for the presence of double-underscore-prepended * pthread primitives, and use them if available. @@ -62,28 +55,18 @@ void PTHREAD_init_done(void) asm(".globl " PSTR(alias) "\n" \ "\t.set " PSTR(alias) "," PSTR(orig)) -/* strong_alias does not work on external symbols (.o format limitation?), - * so for those, we need to use the pogo stick */ -#if defined(__i386__) && !defined(__PIC__) -/* FIXME: PIC */ -#define jump_alias(orig, alias) __ASM_GLOBAL_FUNC( alias, "jmp " PSTR(orig)) -#endif +static int init_done; -/* get necessary libc symbols */ -#if (__GLIBC__ == 2) && (__GLIBC_MINOR__ >= 1) && defined(HAVE___LIBC_FORK) -#define LIBC_FORK __libc_fork -#define PTHREAD_FORK __fork -#define ALIAS_FORK -#else -#define LIBC_FORK __fork -#define PTHREAD_FORK fork -#endif -extern pid_t LIBC_FORK(void); +static pid_t (*libc_fork)(void); +static int (*libc_sigaction)(int signum, const struct sigaction *act, struct sigaction *oldact); + +void PTHREAD_init_done(void) +{ + init_done = 1; + if (!libc_fork) libc_fork = dlsym( RTLD_NEXT, "fork" ); + if (!libc_sigaction) libc_sigaction = dlsym( RTLD_NEXT, "sigaction" ); +} -#define LIBC_SIGACTION __sigaction -extern int LIBC_SIGACTION(int signum, - const struct sigaction *act, - struct sigaction *oldact); /* NOTE: This is a truly extremely incredibly ugly hack! * But it does seem to work... */ @@ -255,15 +238,20 @@ int __pthread_atfork(void (*prepare)(void), } strong_alias(__pthread_atfork, pthread_atfork); -pid_t PTHREAD_FORK(void) +pid_t __fork(void) { pid_t pid; int i; + if (!libc_fork) + { + libc_fork = dlsym( RTLD_NEXT, "fork" ); + assert( libc_fork ); + } EnterCriticalSection( &atfork_section ); /* prepare handlers are called in reverse insertion order */ for (i = atfork_count - 1; i >= 0; i--) if (atfork_prepare[i]) atfork_prepare[i](); - if (!(pid = LIBC_FORK())) + if (!(pid = libc_fork())) { InitializeCriticalSection( &atfork_section ); for (i = 0; i < atfork_count; i++) if (atfork_child[i]) atfork_child[i](); @@ -275,9 +263,7 @@ pid_t PTHREAD_FORK(void) } return pid; } -#ifdef ALIAS_FORK -strong_alias(PTHREAD_FORK, fork); -#endif +strong_alias(__fork, fork); /***** MUTEXES *****/ @@ -658,13 +644,20 @@ int pthread_setcanceltype(int type, int *oldtype) /***** ANTI-OVERRIDES *****/ /* pthreads tries to override these, point them back to libc */ -#ifdef jump_alias -jump_alias(LIBC_SIGACTION, sigaction); -#else int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact) { - return LIBC_SIGACTION(signum, act, oldact); + if (!libc_sigaction) + { + libc_sigaction = dlsym( RTLD_NEXT, "sigaction" ); + assert( libc_sigaction ); + } + return libc_sigaction(signum, act, oldact); +} + +#else /* __GLIBC__ */ + +void PTHREAD_init_done(void) +{ } -#endif #endif /* __GLIBC__ */