rethinking RTLD_NOW for loading plug-in modules

Nicolas Williams Nicolas.Williams at
Tue May 1 00:22:24 EDT 2007

On Tue, May 01, 2007 at 12:16:01AM -0400, Ken Raeburn wrote:
> On Apr 30, 2007, at 23:59, Nicolas Williams wrote:
> >>Do you wind up with more than one copy of libc mapped in?  Or does
> >
> >No.  You can only do that sort of thing if you use separate link maps
> >(see dlmopen(3C), which you don't want to use for this kind of
> >application :), or if you have multiple different versions of given
> >shared object.  In the latter case symbol resolution after that will
> >greatly depend on whether RTLD_LOCAL and RTLD_GROUP were used.
> That's what I thought.  (Though if one module wants to override  
> symbol definitions in a shared library used by multiple modules, I  
> suspect this could lead to some confusion based on the order of  
> access of modules.)

Exactly.  This is called "symbol interposition" :)  Usually it's done on

> >>this part of the penalty, resolving the libc references, only happen
> >>with the first libc-using object opened with RTLD_NOW?
> >
> >It's not just libc -- all dependencies of an object opened with  
> >will be opened and all relocations will be perfomed recursively until
> >all relocations in the object have been done and in the object's
> >dependencies, and their dependencies, ..., even though most of these
> >relocations may never be needed.
> Yes, I understand.  My point was that for any of them that are shared  
> by more than one module, the penalty would only be paid once.  If you  

But I think Tom's point is that libc is large (i.e., has a large number
of relocations)?

> open multiple modules at once, as I'd expect you would do with SPNEGO  
> or if you have to search all modules for a mechanism OID, the cost  
> isn't N times the cost of resolving all of libc, plus M times the  
> cost of resolving libkrb5, etc.  (Though libc may well be the only  
> part shared between them, sometimes.)

Right, it's a one-time penalty, but for some apps that one-time penalty
is an every time penalty (e.g., ftp) because an instance is
fork()ed/exec()ed for every use of that app.  For something like httpd
or gssd the penalty is one-time per-restart.


More information about the krbdev mailing list