NetBSD-Bugs archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: lib/49791: dlopen(0, and dlopened libraries



The following reply was made to PR lib/49791; it has been noted by GNATS.

From: Joerg Sonnenberger <joerg%britannica.bec.de@localhost>
To: gnats-bugs%NetBSD.org@localhost
Cc: lib-bug-people%netbsd.org@localhost, gnats-admin%netbsd.org@localhost,
	netbsd-bugs%netbsd.org@localhost
Subject: Re: lib/49791: dlopen(0, and dlopened libraries
Date: Fri, 27 Mar 2015 18:47:11 +0100

 On Thu, Mar 26, 2015 at 11:45:00PM +0000, prlw1%cam.ac.uk@localhost wrote:
 > that our dlopen() does (cf dlfcn(3))
 > 
 >      If the first argument is NULL, dlopen() returns a handle on the global
 >      symbol object.  This object provides access to all symbols from an
 >      ordered set of objects consisting of the original program image and any
 >      dependencies loaded during startup.
 
 This is the same behavior documented on glibc
 
 > whereas accoding to posix in
 > 
 >   http://pubs.opengroup.org/onlinepubs/007904975/functions/dlopen.html
 > 
 > If the value of file is 0, dlopen() shall provide a handle on a global
 > symbol object. This object shall provide access to the symbols from an
 > ordered set of objects consisting of the original program image file,
 > together with any objects loaded at program start-up as specified by
 > that process image file (for example, shared libraries), and the set
 > of objects loaded using a dlopen() operation together with the
 > RTLD_GLOBAL flag. As the latter set of objects can change during
 > execution, the set identified by handle can also change dynamically.
 
 This, frankly, doesn't make sense.
 
 > glib assumes the posix variant, and we have a patch in pkgsrc to detect ours as broken.
 
 How can it? It doesn't seem like glibc provides the same:
 
   If filename is NULL, then the returned handle is for the main program.
 
 > #include <err.h>
 > #include <dlfcn.h>
 > #include <stdio.h>
 > 
 > int main()
 > {
 >     void *handle;
 > 
 >     handle = dlopen ("libm.so", RTLD_GLOBAL | RTLD_LAZY);
 >     if (handle == NULL)
 >         errx(1, "dlopen of libm failed (%s)", dlerror());
 > 
 >     handle = dlopen (NULL, 0);
 >     if (handle == NULL)
 >         errx(1, "dlopen of global symbol object failed (%s)", dlerror());
 > 
 >     handle = dlsym (handle, "sin");
 >     if (handle == NULL)
 >         errx(1, "sin() not found in libm (%s)", dlerror());
 
 I think the "correct" behavior here is:
 
 dlsym(RTLD_DEFAULT, "sin");
 
 Joerg
 


Home | Main Index | Thread Index | Old Index