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

Bug#232920: ld.so: unversioned symbols allowed to satisfy unresolved references to versioned symbols



On Sun, Feb 15, 2004 at 01:55:46PM -0600, Steve Langasek wrote:
> Package: libc6
> Version: 2.3.2.ds1-11
> 
> It appears that, given:
> 
> library libbar, providing version BAR1 of symbol bar_sym1;
> library libquux, linked against libbar and using (version BAR1 of) bar_sym1;
> and program foo, linked with -rdynamic, providing unversioned symbol
>   bar_sym1, and dlopen()ing libquux,
> 
> the versioned reference to bar_sym1 from libquux will be resolved using
> the unversioned symbol in foo, instead of the versioned symbol in
> libbar.
> 
> This problem also manifests if the unversioned bar_sym1 symbol is
> provided by a library that was dlopen()ed prior to dlopen()ing libquux;
> if foo is linked against libquux rather than dlopen()ing it; and,
> presumably, if foo is linked against both a lib (libbar0) providing the
> unversioned symbol and against libquux, but libbar0 is opened first.
> 
> I had somehow reached the conclusion that this was documented and
> deliberate behavior, but Andrew Suffield <asuffield@debian.org>
> indicates otherwise and asked that I file a bug.  The attached tarball
> contains a small test case that can be used to reproduce the problem,
> showing that unversioned symbols are allowed to satisfy unresolved
> references to versioned symbols.

I am fairly positive that Andrew is wrong.  This behavior is, for
instance, one which allows LD_PRELOAD libraries to continue to work.
However, there is a definite shortage of conclusive documentation.  The
ELF gABI does not specify.  The Solaris documentation is distinctly
vague on this point.

Glibc says only:
              /* We can match the version information or use the
                 default one if it is not hidden.  */


-- 
Daniel Jacobowitz
MontaVista Software                         Debian GNU/Linux Developer



Reply to: