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>