Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 31 Dec 2007 14:26:20 -0500
From:      Alexander Kabaev <kabaev@gmail.com>
To:        "Markus Hoenicka" <markus.hoenicka@mhoenicka.de>
Cc:        freebsd-hackers@freebsd.org
Subject:   Re: dlopen(), atexit() crash on FreeBSD (testcase included)
Message-ID:  <20071231142620.39f2fbd2@kan.dnsalias.net>
In-Reply-To: <18297.6718.750894.937199@yeti.mininet>
References:  <18297.6718.750894.937199@yeti.mininet>

next in thread | previous in thread | raw e-mail | index | archive | help
--Sig_/GwOo5uNn_S_7+PXNyx5=9Pm
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable

On Mon, 31 Dec 2007 17:35:10 +0100
"Markus Hoenicka" <markus.hoenicka@mhoenicka.de> wrote:

> Hi,
>=20
> I've been redirected by Giorgos Keramidas to this list after reporting
> a problem on the freebsd-questions list. I'd greatly appreciate if you
> could have a look at the following problem. Apparently programs are
> doomed to segfault on FreeBSD if dlopen()ed modules install exit
> handlers via atexit(). Similar problem reports have cropped up before,
> see e.g.
>=20
> http://www.imagemagick.org/pipermail/magick-developers/2006-March/002523.=
html
>=20
> My system runs:
>=20
> FreeBSD yeti.mininet 6.1-RELEASE FreeBSD 6.1-RELEASE #1: Mon Aug 28
> 22:24:48 CEST 2006
> markus@yeti.mininet:/usr/src/sys/i386/compile/YETI  i386
>=20
> I'm one of the developers of libdbi, a database abstraction layer for
> C, see http://libdbi.sourceforge.net.
>=20
> libdbi is a library for programs which are supposed to be able to
> access different database engines with a unified API. libdbi
> essentially maps generic API calls to the specific database client
> library calls of a particular database engine. To do this, libdbi
> loads available database drivers at runtime via dlopen() calls. Each
> of these drivers is linked against one database client
> library. E.g. the Firebird driver is linked against
> libfbclient.so. When libdbi is properly shut down, it unloads all
> loaded drivers by calling dlclose() on each of them.
>=20
> This design works well on all supported platforms and with all
> supported database engines, with one exception: the Firebird driver on
> FreeBSD invariably causes a segfault when the application linked
> against libdbi exits:
>=20
> #0  0x28514fe4 in ?? ()
> #1  0x281507c3 in __cxa_finalize () from /lib/libc.so.6
> #2  0x281503fe in exit () from /lib/libc.so.6
> #3  0x0804a40f in main (argc=3D1, argv=3D0xbfbfe754) at test_dbi.c:419
>=20
> The reason appears to be that the Firebird client libraries install
> exit handlers via atexit(). Remember that due to libdbi's design to
> load all available drivers whether or not they are used later, libdbi
> will cause a crash even if no Firebird database is accessed - it is
> sufficient that the driver has been loaded. As per Giorgos' suggestion
> it is simple to circumvent this segfault by avoiding the call to
> dlclose() before exiting, but I wonder whether there is a more robust
> solution for this problem.
>=20
> The attached minimal testcase is sufficient to illustrate the
> problem. atexitmod.c defines a module which is loaded by datest.c Make
> sure to fix the hardcoded path in datest.c before building the app. To
> build the test program and watch it crash, do the following:
>=20
> gcc -shared -o atexitmod.so atexitmod.c
> gcc -o datest datest.c
> ./datest
>=20
> Commenting out either the atexit() call in atexitmod.c or the
> dlclose() call in datest.c prevent the segfault.
>=20
> If you find some solution, please cc me as I'm not subscribed to
> freebsd-hackers.
>=20
> regards,
> Markus

As designed. atexit should not be used by shared objects that do not
expect themselves to live until actual exit() happens. ELF provides
proper _init/_fini sections to support shared object
initialization/destruction.

--=20
Alexander Kabaev

--Sig_/GwOo5uNn_S_7+PXNyx5=9Pm
Content-Type: application/pgp-signature; name=signature.asc
Content-Disposition: attachment; filename=signature.asc

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.7 (FreeBSD)

iD8DBQFHeUJcQ6z1jMm+XZYRAiCzAJ94kVQ5yrRdhSdtjxzrhHZKPK3awACcDrSU
q6TUk0RsoiMf0oN/S73q0nE=
=9at7
-----END PGP SIGNATURE-----

--Sig_/GwOo5uNn_S_7+PXNyx5=9Pm--



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