ร tutto un simbolo
Posted: Giugno 7th, 2008 | Author: packz | Filed under: Bash, Hack, Life, Programmazione | Commenti disabilitati su ร tutto un simboloLa 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=$2OUTPUT=`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).