Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 15 Nov 2008 00:58:41 +0100
From:      "Markus Hoenicka" <markus.hoenicka@mhoenicka.de>
To:        Jeremy Chadwick <koitsu@FreeBSD.org>
Cc:        freebsd-questions@FreeBSD.org
Subject:   Re: dlsym can't use handle returned by dlopen?
Message-ID:  <18718.4273.817459.356946@yeti.mininet>
In-Reply-To: <20081113121822.GA20600@icarus.home.lan>
References:  <18715.28127.306511.577084@yeti.mininet> <20081113042912.GA10018@icarus.home.lan> <20081113090021.less3h5iwwsgwsg4@webmail.df.eu> <20081113081456.GA14564@icarus.home.lan> <20081113092059.gjjufgrxss0gwww0@webmail.df.eu> <20081113082402.GA14906@icarus.home.lan> <20081113121822.GA20600@icarus.home.lan>

next in thread | previous in thread | raw e-mail | index | archive | help
Jeremy Chadwick writes:
 > As promised: http://www.malkavian.com/~jdc/myprog.tar.gz
 > 

This test program indeed works as expected. However, this doesn't
quite reflect the situation in libdbi. I took your files and modified
them accordingly, see:

http://libdbi.sourceforge.net/downloads/dlsymtest.tar.gz

To run the test use:

LD_LIBRARY_PATH=. ./myprog

We need to set the environment variable to let the linker pick up a
shared object that gmake builds.

myprog.c now just calls a function which is provided in libmylib
(built from mylib.c). The latter file does most of what your test case
did in myprog.c. The second major change is that myshared.so is linked
against libmysqlclient (just like a libdbi database driver is linked
against the client library). myfunc now calls a MySQL function to show
that it is accessible (if you don't have libmysqlclient handy, you can
replace it with whatever function from some .so is convenient)

Finally, libmylib tries to obtain a pointer to that MySQL function by
means of a dlsym call. This new dlsym call, in contrast to the existing
one that acesses myfunc in myshared.so, indeed fails:

myint = 0xdeadbeef (3735928559)
==> entered myfunc()
==>     double = 3.141590
==>mysql client version is 50051
==> exiting myfunc()
dlsym() in shared lib failed: Undefined symbol
"mysql_get_client_version"

So, to make the problem clear again: while dlsym works when accessing
symbols in dlopen()ed objects, it fails to access symbols which are
linked into such an object if you use the handle returned by
dlopen(). This is different from other OSes.

regards,
Markus


-- 
Markus Hoenicka
markus.hoenicka@cats.de
(Spam-protected email: replace the quadrupeds with "mhoenicka")
http://www.mhoenicka.de



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