Date: Fri, 16 Jun 1995 18:04:20 +0100 (BST) From: Doug Rabson <dfr@render.com> To: hackers@freebsd.org Subject: dlopen and friends Message-ID: <Pine.BSF.3.91.950616174554.291D@minnow.render.com>
next in thread | raw e-mail | index | archive | help
I have been mucking about with the latest snapshot of Fresco and have
come up against a few problems with dlopen:
1. Only one layer of dependant libraries is loaded. There is code which
would recursively load sub-dependants but it is broken and hence is
commented out.
2. The manpage for dlopen specifies that _init will be called for newly
loaded libraries but dlopen actually looks up "_init" which will end up
calling the user function init(). Is this correct? I compiled a test
library on SunOS containing init(), _init() and asm(".init")() and SunOS
4.1.3 doesn't call any of them. I think dlopen should be using the
string "__init" to search for _init() in the loaded object. Similar
comments apply to dlclose.
3. There is code in /usr/lib/c++rt0.o which calls constructors and
destructors for shared libraries. This is not used by libg++ which is
the only c++ library in the core. It also doesn't appear to be
documented anywhere. In addition, c++rt0.o uses atexit to register a
function to call the destructors, however if dlclose is later used to
remove the library, this will ensure a segfault on exit since exit() will
still attempt to call the function.
4. dlclose does not unload dependant libraries or call destructors for
the unloaded object.
I want to make some changes to ld.so to fix these problems, along these
lines:
1. Fix ld.so to load all the dependant libraries for dlopen recursively.
Ensure that initialisation of newly loaded libraries is deferred until
all the dependants are loaded and relocated to allow sub-dependants to
use symbols from their parent during initialisation.
2. Call ".init" to handle constructors and "__init" for user-supplied
initialisation as per manpage.
3. Stop c++rt0.o from using atexit to call the destructors and added a
".fini" function to call them instead.
4. Change dlclose to unload dependant libraries and call ".fini" to handle
destructors. For user-supplied closedown code, use "__fini" instead of
"_fini".
5. Add a dlexit function to the ld_entry function vector returned to
crt0.o by ld.so. This function is registered with atexit by crt0.o and
calls all the ".fini" entry points of any shared libraries which are
still loaded when the application exits.
--
Doug Rabson, Microsoft RenderMorphics Ltd. Mail: dfr@render.com
Phone: +44 171 251 4411
FAX: +44 171 251 0939
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?Pine.BSF.3.91.950616174554.291D>
