Newsgroup: it.comp.os.linux.development
Titolo: ldd e versione minima delle librerie linkate

Ciao a tutti,
Ho la necessità di individuare le versioni minime delle librerie dinamiche
necessarie al funzionamento di un programma del quale dispongo solo degli
eseguibili.
usando ldd ottengo un output del dipo:
$ldd -v nexuiz-linux-x86-sdl
ldd: warning: you do not have execution permission for
`./nexuiz-linux-x86-sdl'
                libm.so.6 => /lib/tls/i686/cmov/libm.so.6 (0xb7fcc000)
        libdl.so.2 => /lib/tls/i686/cmov/libdl.so.2 (0xb7fc9000)
        libSDL-1.2.so.0 => /usr/lib/libSDL-1.2.so.0 (0xb7f24000)
        libpthread.so.0 => /lib/tls/i686/cmov/libpthread.so.0 (0xb7f14000)
        libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0xb7de7000)
        /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x80000000)
        libX11.so.6 => /usr/X11R6/lib/libX11.so.6 (0xb7d22000)
        libXext.so.6 => /usr/X11R6/lib/libXext.so.6 (0xb7d15000)
        Version information:
        ./nexuiz-linux-x86-sdl:
                libdl.so.2 (GLIBC_2.1) => /lib/tls/i686/cmov/libdl.so.2
                libdl.so.2 (GLIBC_2.0) => /lib/tls/i686/cmov/libdl.so.2
                libpthread.so.0 (GLIBC_2.0)
=> /lib/tls/i686/cmov/libpthread.so.0
                libm.so.6 (GLIBC_2.0) => /lib/tls/i686/cmov/libm.so.6
                libc.so.6 (GLIBC_2.3) => /lib/tls/i686/cmov/libc.so.6
                libc.so.6 (GLIBC_2.0) => /lib/tls/i686/cmov/libc.so.6
        /lib/tls/i686/cmov/libm.so.6:
                ld-linux.so.2 (GLIBC_PRIVATE) => /lib/ld-linux.so.2
                libc.so.6 (GLIBC_2.1.3) => /lib/tls/i686/cmov/libc.so.6
                libc.so.6 (GLIBC_2.0) => /lib/tls/i686/cmov/libc.so.6
        /lib/tls/i686/cmov/libdl.so.2:
                libc.so.6 (GLIBC_2.3) => /lib/tls/i686/cmov/libc.so.6
                libc.so.6 (GLIBC_2.1.3) => /lib/tls/i686/cmov/libc.so.6
                libc.so.6 (GLIBC_2.1) => /lib/tls/i686/cmov/libc.so.6
                libc.so.6 (GLIBC_PRIVATE) => /lib/tls/i686/cmov/libc.so.6
                libc.so.6 (GLIBC_2.0) => /lib/tls/i686/cmov/libc.so.6
                ld-linux.so.2 (GLIBC_PRIVATE) => /lib/ld-linux.so.2
[................................................]
Ora, per quanto ne so questo programma è stato compilato prima del rilascio
delle GLIBC 2.3.
Il risultato che ottengo è pero come nell'esempio di sopra: compaiono dei
riferimenti alle GLIBC_2.3.
Da cui le domande:
1) Ciò che mi restituisce ldd fa riferimento alla versione delle librerire
che ho installato sul mio sistema o sono i reali requisiti minimi
dell'eseguibile esaminato?
2) Usare ldd è il modo corretto per effettuare questo tipo di indagine o
dovrei seguire un altro approccio, usando usare altre utility?
Grazie tante per le risposte.
Ciao
 Ivo

    dovrei seguire un altro approccio, usando usare altre utility?
Come ti dicevo, nessuna utility puo' aiutarti. Solo la documentazione
(release notes) delle librerie in esame. E vari test!
 Ciao Federico

 
Ciao,
-- 
Matteo Settenvini
FSF Associated Member
Email : 
mat...@member.fsf.org
-----BEGIN GEEK CODE BLOCK-----
Version: 3.12
GCS d--(-) s+:- a-- C++ UL+++
P?>++ L+++>$ E+>+++ W+++ N++ o?
w--- O- M++ PS++ PE- Y+>++
PGP+++ t+ 5 X- R tv-- b+++ DI+
D++ G++ e h+ r-- y?
------END GEEK CODE BLOCK------

 discretamente il suo sporco lavoro in mancanza di altro.
Non metto in dubbio che ldd possa aiutare (l'ho usato spesso anch'io), 
pero' io mi riferivo ad una cosa leggermente diversa ... si chiedeva se 
ldd potesse dire la versione *minima* necessaria di una libreria ...
ora ldd ti dice con quale libreria l'eseguibile e' stato linkato ... e se 
non ce l'hai?
Se ldd dice che ci vorrebbe libpippo-1.2.3, e tu hai libpippo-1.3.0, ti va 
bene o no? Non puoi saperlo a priori! Certo, il minor e' cambiato e 
qualcosa vorra' dire, ma magari quello che serve al tuo programma non e' 
stato modificato tra le versioni ... Solo la documentazione ti puo' 
aiutare in un caso simile, e una bella sessione di test!!
 Ciao
 Federico

OK la situazione ora mi è più chiara.
Procederò ad una serie di test per verrificare le funzionalità.
Grazie tante.
 Ivo

 in questo caso, ld se ne accorgerebbe...
Solo il compilatore C++ inserisce il prototipo completo nel nome del 
simbolo, e per questo puoi fare overloading. Il compilatore C utilizza solo
il nome della funzione.
Dimostrazione? man dlopen, prendi l'esempio relativo alla funzione cos.
Il prototipo in libm é double cos(double), ma tu caricandola con dlsym puoi
tranquillamente forzarla in int cos(int) o quello che vuoi.
-- 
  Giuseppe "Cowo" Corbelli \/\ My software: 
http://cowo.yoda2000.net
    **ANTI-SPAM** -- **Substitute IHATESPAM with cowo to reply by mail**
    -<! And the will shall return And again hearts shall burn
         All the horns now will sing Leading you back to the metal winds !>-
                  Lost Horizon - Sworn In The Metal Wind

 solo il nome della funzione.
Ciao,
 posso fare l'avvocato delle cause perse? ;-)
Chi ci dice che abbiamo a che fare con codice prodotto da un compilatore? 
E se io mi scrivo il mio bel codice in assembler, e scrivo una funzione 
che si chiama pippo_di_int, e poi invece quello che trovo sullo stack lo 
uso come un puntatore?
Ok, basta con gli scherzi :-)
 Ciao
 Federico