On Jan 3, 2012, at 1:23 AM, David Laight wrote:

> 
>> On all modern UN*Xes, as far as I know, a dynamic library can 
>> be linked with another dynamic library, and if a program is 
>> explicitly linked with the first of those libraries, but 
>> *not* explicitly linked with the second of those libraries, 
>> the program will still work - the run-time linker will see 
>> that the first library requires the second library and will 
>> load and bind it in at run-time.
> 
> The gnu/linux folks have recently changed the behaviour
> of gld (probably contrary to the elf specification, but
> they tend not to care about standards)

I either no longer have my old dead-tree SVR4 ABI documents or have them buried 
in a box somewhere that's probably in storage, but the version at

        http://www.sco.com/developers/devspecs/gabi41.pdf

says

        Shared Object Dependencies

        When the link editor processes an archive library, it extracts library 
members and copies them into the output object file. These statically linked 
services are available during execution without involving the dynamic linker. 
Shared objects also provide services, and the dynamic linker must attach the 
proper shared object files to the process image for execution.

        When the dynamic linker creates the memory segments for an object file, 
the dependencies (recorded in DT_NEEDED entries of the dynamic structure) tell 
what shared objects are needed to supply the program’s services. By repeatedly 
con- necting referenced shared objects and their dependencies, the dynamic 
linker builds a complete process image. When resolving symbolic references, the 
dynamic linker examines the symbol tables with a breadth-first search. That is, 
it first looks at the symbol table of the executable program itself, then at 
the symbol tables of the DT_NEEDED entries (in order), then at the second level 
DT_NEEDED entries, and so on. Shared object files must be readable by the 
process; other per- missions are not required.

That doesn't seem to specify anything about what the link editor, as opposed to 
the dynamic linker, must do about DT_NEEDED structures.

> so that linker
> will not assume that libraries referenced by DT_NEEDED
> entries in other libraries have their symbols made available
> to teh main program.

Do you have any references for this, so I can see exactly what it means?

If it just means that if you build an executable image (or shared library), 
linking it with library A, and library A is a shared that is linked with 
library B, and if the executable image is *not* linked with library B when you 
build it, if the image refers to routines in library B those references will 
*not* be treated as resolved by virtue of library B being dragged in by library 
B, that doesn't appear to break the scenario I describe.

> This breaks many things!

Does it, in particular, break the scenario I describe?

> What happens at run time depends on the dynamic linker.

If, with some dynamic linker, it means that if an executable image is linked 
with library A, and is not linked with library B and does not use anything from 
library B, and library A is linked with library B and does use things from 
library B, then, when that executable image is run, symbols from library B are 
not available to the main program, that doesn't break my scenario, and I'm not 
sure what useful things it would break.

If, with some dynamic linker, it means that if an executable image is linked 
with libraries A and B, and does use thinks from library B, and library A is 
linked with library B and does use things from library B, then, when that 
executable image is run, symbols from library B are not available to the main 
program, that would be Very Bad and Very Stupid.  Would there be any dynamic 
linkers that work that way?
-
This is the tcpdump-workers list.
Visit https://cod.sandelman.ca/ to unsubscribe.

Reply via email to