libsasl2.so.2: no version information available

Pavel Kankovsky peak na argo.troja.mff.cuni.cz
Sobota Září 30 11:29:35 CEST 2006


On Tue, 26 Sep 2006, Ondrej Koala Vacha wrote:

> > Hlásí ldd -v /usr/local/lib/libsasl2.so.2 něco podobného?
> Ne:

> > Co říká na objdump -T /usr/local/lib/libsasl2.so.2? Jsou tam mezi adresou 
> > a symbolem názvy verzí jako GLIBC_2.0?
> Zda se ze ano:

Curiouser and curiouser. Raději jsem se podíval do zdrojáků a našel jsem
tohle (funkce match_symbol v elf/dl-version.c):

  if (__builtin_expect (map->l_info[VERSYMIDX (DT_VERDEF)] == NULL, 0))
    {
      /* The file has no symbol versioning.  I.e., the dependent
         object was linked against another version of this file.  We
         only print a message if verbose output is requested.  */
      if (verbose)
        {
          /* XXX We cannot translate the messages.  */
          errstring = make_string ("\
no version information available (required by ", name, ")");
          goto call_cerror;
        }
      return 0;
    }

Aha! Takže je to asi trochu jinak. Tady to vypadá, že tím chtěl básník
říct, že program (/usr/cyrus/bin/imapd) byl slinkovaný s libsasl2.so.2, ve
kterém byly nějaké *exportované* verzované symboly, ale teď je mu
předkládána varianta této knihovny, kde žádné verzované symboly nejsou.

Této diskrepance by se skutečně dalo dosáhnout různou kompilací, či 
přesněji linkováním, libsasl2.so.2. Jednou s --version-script, podruhé
bez něj.

Zkuste to ldd pustit s LD_DEBUG=versions (viz LD_DEBUG=help 
/lib/ld-linux.so.2).

Zkuste ještě jednou pustit ten objdump -T na /usr/local/lib/libsasl2.so.2, 
/usr/cyrus/bin/imapd, a pokud je k dispozici i libsasl2.so.2 použitý pro 
výrobu toho imapd, tak i na něj a porovnat symboly exportované 
z libsasl2.so.2 a importované do imapd.

--Pavel Kankovsky aka Peak  [ Boycott Microsoft--http://www.vcnet.com/bms ]
"Resistance is futile. Open your source code and prepare for assimilation."



Další informace o konferenci Linux