Skip site navigation (1)Skip section navigation (2)
Date:      30 Jul 1997 11:15:01 +0200
From:      Walter Hafner <hafner@forwiss.tu-muenchen.de>
To:        freebsd-questions@FreeBSD.ORG, hafner@forwiss.tu-muenchen.de
Subject:   questions about dlopen()
Message-ID:  <s9nyb6oyk8a.fsf@pccog4.forwiss.tu-muenchen.de>

next in thread | raw e-mail | index | archive | help
The following message is a courtesy copy of an article
that has been posted as well.

Hi there!

I've got a few questions regarding the 'dlopen()' call. I had a look at
the sources (/usr/src/lib), but didn't find any references to
dlopen(). The manpage is no help either.

Problem: We try to read shared libs into an application at runtime. Our
application supports various framegrabbers on various hardware (HP, Sun,
SGI, PC/Linux, PC/FreeBSD ...) and we have to load wrapper-libs that
provide a consistent user interface at runtime (plus the vendor-specific
libs of course). That's where 'dlopen()' comes in handy. The following
code snipplet works on _all_ hard- and software combinations _except_
FreeBSD 2.2.* (didn't try 2.1.*):

    #define RTLD_LAZY 1
    [...]
    hndl = dlopen(name,RTLD_LAZY); 
    if (hndl == NULL) 
      return H_ERR_DLOPEN; 

On all platforms except FreeBSD, dlopen() searches LD_LIBRARY_PATH for
the library and returns successfully. On FreeBSD, I get a NULL
pointer. If I query dlerror(), I get a "2 ENOENT No such file or
directory".

dlopen() finds the library only if I cd into the lib-Directory.

If it's a ldconfig problem: I can't use ldconfig, because the wrapper
libs are named after the corresponding framegrabbers. In the current
case: Meteor.so. Ldconfig only looks for files named libXXX.so.XXX.

So what's the deal? If a filename is passed to dlopen(), dlopen() seems
to look only in the exact path the filename specifies. And if a name
without directory information is passed, only the current directory is
searched. I find this behaviour very frustrating. Compare the Solaris
manpage to dlopen():

	A path name containing an
	embedded '/' is interpreted as an absolute path or  relative
	to  the current directory, otherwise the set of search paths
	currently in effect by the run-time linker will be  used  to
	locate the specified file

Linux is similar:

	If filename is  not  an
	absolute  path  (i.e., it does not begin with a "/"), then
	the file is searched for in the following locations:
 
              A colon-separated list of directories in the user's
              LD_ELF_LIBRARY  path  environment variable.  If and
              only  if  LD_ELF_LIBRARY_PATH   is   not   defined,
              LD_LIBRARY_PATH is used in its place.

The FreeBSD manpage gives no informations on the search path. As I said:
FreeBSD seems to be the only system that handles dlopen() arguments that
way.

Or _does_ the FreeBSD dlopen() search the library path, but looks only
for lib*.so like ldconfig does?

Is there any convenient way to circumvent these problems? Currently I
use a 
getenv("LD_LIBRARY_PATH");
call and then fiddle with the result to provide dlopen() with all the
paths to look in. Is this _really_ the only solution?

Thanks,

-Walter

PS: The date of dlopen(3) is "24 September 1989" ... maybe time for an
update?

-- 
Walter Hafner_____________________________ hafner@forwiss.tu-muenchen.de
     <A href=http://www.forwiss.tu-muenchen.de/~hafner/>*CLICK*</A>;
 The best observation I can make is that the BSD Daemon logo is _much_
 cooler than that Penguin :-)                       (Donald Whiteside)



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