dlopen() and dlclose() are not MT-safe?
Kazuaki Oda
kaakun at highway.ne.jp
Wed Mar 22 14:36:56 UTC 2006
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
More information about the freebsd-hackers
mailing list