Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 22 Mar 2006 23:32:09 +0900
From:      Kazuaki Oda <kaakun@highway.ne.jp>
To:        hackers@freebsd.org
Subject:   dlopen() and dlclose() are not MT-safe?
Message-ID:  <44215FE9.2070602@highway.ne.jp>

next in thread | raw e-mail | index | archive | help
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



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?44215FE9.2070602>