Dynamic linking

Matthew Dillon dillon at apollo.backplane.com
Sun Nov 30 15:00:20 PST 2003


:Hello,
:
:Those who follow freebsd-current know that there has been an epic thread 
:about the slowness of dynamic linking in FreeBSD, in which John Dyson and
:Matt Dillon sent some posts. I have been told by an OpenBSD developer that
:they have introduced a cache of the position of the dynamic libraries, and
:that this modification alone was sufficient to improve considerably
:the startup time of KDE. In fact the developer sais that KDE starts up 3 
:times faster, but this was perhaps exagerate. Perhaps this a valuable track 
:to investigate, since it is apparently a small impact modification of the 
:dynamic linker.

    Yes.  Well, basically the only way to make a dynamic binary 'load'
    as fast as a static binary is pre-link the dynamic libraries and the
    main binary, write out cache files representing the prelinked result,
    and then mmap() the prelinked cache file instead of the DLL.  One still
    has to check at least timestamps to be sure that none of the DLLs or the
    main binary has changed, but otherwise it would very close to a static
    binary load.

    Another way to think of it: run the program as per normal but 'save'
    an image of it just after the last DLL has been loaded, before the
    program's main() function is called.

    In fact, it occurs to me that we could use Kip's checkpointing code to
    perform this function in a manner similar to the way 'ldd' works.  We
    could even augment the code to 'copy' the contents of shared segments
    in addition to anonymous memory so only a single file need be mmap().

    I'm not sure that it is worth persuing because startup times for large
    programs are not really a performance bottleneck.  Still, if one can 
    actually achieve a 3x performance improvement loading something like
    KDE it might well be worth doing.

						-Matt






More information about the Kernel mailing list