Ricerca tra la vecchia roba

รˆ tutto un simbolo

Posted: Giugno 7th, 2008 | Author: | Filed under: Bash, Hack, Life, Programmazione | Commenti disabilitati su รˆ tutto un simbolo

La mia quest per la compilazione di Xorg con supporto MPX è senza fine: adesso voglio usare jhbuild che se non altro tiene conto in automatico delle dipendenze (ah… le dipendenze) e permette di gestire anche gli errori di compilazione e la generazione in automatico delle variabili necessarie alla compilazione di progetto ampi come X (è nato come supporto a Gnome); dopo vari segfault del driver della scheda video, adesso mi da un errore su un simbolo indefinito che è stato inserito in evdev da quel mago di Hutterer (uno dei pochi che risponde alle mail di un povero adepto della programmazione come me) e che non risulta in nessun file oggetto compilato e presente nei sorgenti. Adesso non vi voglio fare un corso su come funziona la resoluzione dei simboli a runtime da parte del loader, per rendervi conto se le librerie sono correttamente impostate in un eseguibile basta dare

$ LD_LIBRARY_PATH=/path/to/strange/library  ldd  /bin/ls
    linux-gate.so.1 =>  (0xffffe000)
    librt.so.1 => /lib/i686/cmov/librt.so.1 (0xb7ef1000)
    libselinux.so.1 => /lib/libselinux.so.1 (0xb7ed8000)
    libacl.so.1 => /lib/libacl.so.1 (0xb7ed0000)
    libc.so.6 => /lib/i686/cmov/libc.so.6 (0xb7d82000)
    libpthread.so.0 => /lib/i686/cmov/libpthread.so.0 (0xb7d6a000)
    /lib/ld-linux.so.2 (0xb7f22000)
    libdl.so.2 => /lib/i686/cmov/libdl.so.2 (0xb7d66000)
    libattr.so.1 => /lib/libattr.so.1 (0xb7d62000)

per ottenere la risoluzione dei simboli come avverrebbe appunto all’esecuzione del programma (viva le librerie shared);  la variabile d’ambiente LD_LIBRARY_PATH serve per impostare per appositi programmi il percorso nel caso le librerie non siano in percorsi standard e voi non abbiate voglia/capacità di impostare ldconfig(1) (altre eventuali informazioni su questa magica variabile d’ambiente stanno su ld.so(1)). Ecco a voi un programma per scoprire se in qualche cazzo di file oggetto sono contenuti i magici simboli cercati

# To use with
#       $ find /path/to/lib -iname ‘*.so’
#               -exec find-a-symbol.sh ‘{}’ <symbol-to-find> ‘;’
FILENAME=$1
SYMBOL=$2

OUTPUT=`nm $FILENAME|grep $SYMBOL`

if [ "$OUTPUT" != "" ]; then
        echo "#$FILENAME#"
        echo $OUTPUT
fi

 Ed ecco come l’ho usato io per i miei nefando scopi

packz at durruti:/tmp
๐Ÿ™‚ $ find /opt/mpx/lib/ -iname ‘*.so’ -exec ./find-a-symbol.sh ‘{}’ ‘bGetMotionEventsb’  ‘;’
#/opt/mpx/lib/xorg/modules/input/evdev_drv.so#
U GetMotionEvents

l’unico posto dove è definita codesta funzione è in quel cazzo di driver…. speriamo che lui mi risponda…

UPDATE: se la libreria è stripped si può usare objdump -T al posto di nm (cioè se esce "no symbols" con nm).


Comments are closed.