dlsym can't use handle returned by dlopen?

Markus Hoenicka markus.hoenicka at mhoenicka.de
Thu Nov 13 00:00:24 PST 2008

Quoting Jeremy Chadwick <koitsu at FreeBSD.org>:

> I know that the .so's you're loading with dlopen() need to be built a
> specific way/with certain arguments, otherwise they won't work (I
> believe what I saw was dlsym() returning NULL).  My symbol names were
> getting stomped on, and there was a compiler flag that addressed that.

Is that a BSD-specific problem? As mentioned previously, I don't run  
into trouble on other platforms. Is there any documentation available  
which tells me how to build a dlopen()'able object in a portable way?

>> function_pointer = dlsym(RTLD_DEFAULT, "function_name");
>> Why is that? Or rather: what am I doing wrong?
> This code right here is *completely* wrong.  RTLD_DEFAULT is a mode bit
> for dlopen().  I'm willing to bet a strict set of warnings would

Citing the FreeBSD dlsym(3) man page:

"If  dlsym is called with the special  handle  RTLD_DEFAULT, the  
search for the symbol follows the algorithm used for resolving  
undefined symbols when objects are loaded."

You probably had RTLD_LAZY and RTLD_NOW in mind which are dlopen()  
flags. BTW RTLD_NEXT works just as well instead of RTLD_DEFAULT.


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

More information about the freebsd-questions mailing list