Re: dlopen() and dlclose() are not MT-safe?
- From: Kostik Belousov <kostikbel@xxxxxxxxx>
- Date: Wed, 22 Mar 2006 19:43:12 +0200
On Wed, Mar 22, 2006 at 11:32:09PM +0900, Kazuaki Oda wrote:
Hello,
I compiled the following code on 6.1-PRERELEASE and ran:
dltest.c
----------------------------------------------------------------------
#include <err.h>
#include <dlfcn.h>
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#define NTHREADS 10
void *func(void *dummy);
int main(void)
{
pthread_t tids[NTHREADS];
int error;
int i;
for (i = 0; i < NTHREADS; i++) {
error = pthread_create(&tids[i], NULL, func, NULL);
if (error)
errc(1, error, "pthread_create");
}
for (;;)
sleep(1);
/* NOTREACHED */
exit(0);
}
void *func(void *dummy)
{
void *h;
for (;;) {
if ((h = dlopen("/usr/lib/libm.so", RTLD_NOW)) == NULL)
errx(1, "dlopen: %s", dlerror());
if (dlclose(h) == -1)
errx(1, "dlclose: %s", dlerror());
}
/* NOTREACHED */
return (NULL);
}
----------------------------------------------------------------------
% cc -Wall -o dltest dltest.c -lpthread
% ./dltest
ld-elf.so.1: assert failed: /usr/src/libexec/rtld-elf/rtld.c:2445
Segmentation fault (core dumped)
% cc -Wall -o dltest dltest.c -lthr
% ./dltest
% ld-elf.so.1: assert failed: /usr/src/libexec/rtld-elf/rtld.c:1723
Abort (core dumped)
Hmm, it seems dlopen() and dlclose() are not MT-safe. Is this a known
issue?
--
Kazuaki Oda
The following patch put some relief for the problem:
Index: libexec/rtld-elf/rtld.c ===================================================================
RCS file: /usr/local/arch/ncvs/src/libexec/rtld-elf/rtld.c,v
retrieving revision 1.112
diff -u -r1.112 rtld.c
--- libexec/rtld-elf/rtld.c 24 Dec 2005 15:37:30 -0000 1.112
+++ libexec/rtld-elf/rtld.c 22 Mar 2006 17:33:06 -0000
@@ -1688,6 +1688,12 @@
wlock_release(rtld_bind_lock, lockstate);
objlist_call_fini(&list_fini);
lockstate = wlock_acquire(rtld_bind_lock);
+ if (root->refcount == 0) {
+ _rtld_error("%s: object busy", root->path);
+ wlock_release(rtld_bind_lock, lockstate);
+ return -1;
+ }
+
objlist_remove_unref(&list_fini);
/* Finish cleaning up the newly-unreferenced objects. */
But it still allows for the mess of _init/_fini simultaneous calls
from different threads. SUSv3 does not mention constructors/destructors.
Attachment:
pgpFuI6nvTnpj.pgp
Description: PGP signature
- Follow-Ups:
- Re: dlopen() and dlclose() are not MT-safe?
- From: Kostik Belousov
- Re: dlopen() and dlclose() are not MT-safe?
- References:
- dlopen() and dlclose() are not MT-safe?
- From: Kazuaki Oda
- dlopen() and dlclose() are not MT-safe?
- Prev by Date: Re: Installation from USB pen
- Next by Date: Re: dlopen() and dlclose() are not MT-safe?
- Previous by thread: dlopen() and dlclose() are not MT-safe?
- Next by thread: Re: dlopen() and dlclose() are not MT-safe?
- Index(es):
Relevant Pages
- Help in Java swings(internal Frame)
... public int getSize() ... public void valueChanged{ ... private
JScrollPane scrollPane1; ... public class PeakContainer extends JInternalFrame ...
(comp.lang.java.programmer) - [PATCH,RFC 2.6.14 09/15] KGDB: SuperH-specific changes
... This adds basic support for KGDB on SuperH as well as adding some architecture ...
-static int kgdb_uart_getchar ... -static void kgdb_uart_putchar ... * The
command-line option can include a serial port specification ... (Linux-Kernel) - problem in java swings
... public int getSize() ... public void valueChanged{ ... private
JScrollPane scrollPane1; ... public class PeakContainer extends JInternalFrame ...
(comp.lang.java.programmer) - ToolTips in a View and TTN_NEEDTEXT
... extern int g_minWorkPeriod; ... void CDayView::CreateAllFonts ...
void CDayView::DrawDayLog(CDC* pDC) ... BOOL CDayView::TimeToY ... (microsoft.public.vc.mfc) - [PATCH 6/20] FRV: Fujitsu FR-V CPU arch implementation part 4
... +static void register_irq_proc (unsigned int irq); ... (Linux-Kernel)