Fondamentalmente, si tratta di due domande in una: perché se posso elencare tutti i simboli esportati all'interno di un sistema, insieme al loro percorso di libreria condiviso, allora potrei semplicemente grep
quell'output.
Per i simboli del kernel, immagino che sia un po 'più semplice, perché possiamo sempre cat /proc/kallsyms
e ottenere un elenco di tutti i simboli di quei moduli caricati in memoria; quindi sudo cat /proc/modules
fornirà un elenco di moduli caricati con i loro indirizzi, ma non i percorsi da cui sono stati caricati i moduli (se sono costruiti come oggetti .ko separati, fuori dall'albero)
Ad esempio, provo a tracciare il programma kst
usando ltrace
:
$ ltrace kst2
...
_ZNK13QGraphicsItem10parentItemEv(0xa1ccdb4, 0, 0xbfe631a8, 0x823652b, 0xbfe63298) = 0xa1ce854
__dynamic_cast(0xa1ce854, 0x839ff00, 0x8306b80, 84, 0xbfe63298) = 0xa1ce800
_ZNK13QGraphicsItem10parentItemEv(0xa1ccdb4, 0x839ff00, 0x8306b80, 84, 0xbfe63298) = 0xa1ce854
__dynamic_cast(0xa1ce854, 0x839ff00, 0x8306b80, 84, 0xbfe63298) = 0xa1ce800
...
... e vorrei sapere dove _ZNK13QGraphicsItem10parentItemEv
risiede.
Quindi, cosa fare con i simboli della libreria condivisa? Leggere attraverso [gcc-help] Ri: trovare la libreria in cui è definito il simbolo. ; Ho provato qualcosa del genere:
$ find /usr/lib -name '*.so*' -exec nm --print-file-name --defined-only --dynamic {} \; | grep "QGraphicsItem"
...
/usr/lib/libQtGui.so.4.7.2:00766d70 T _Zls6QDebugN13QGraphicsItem16GraphicsItemFlagE
/usr/lib/libQtGui.so.4.7.2:00766aa0 T _Zls6QDebugN13QGraphicsItem18GraphicsItemChangeE
/usr/lib/libQtGui.so.4.7.2:00767e80 T _Zls6QDebugP13QGraphicsItem
...
... ma questo mi dà ulteriori problemi: non conosco davvero tutti i percorsi che sono scansionati per le librerie condivise sul mio sistema, quindi quando ho provato per la prima find /lib ...
volta non ha trovato nulla; Trovo questa supposizione di directory fastidiosa, così come l'alternativa: scansionare l'intero filesystem di root con find
... E inoltre, mi sembra di colpire * .so che non può essere aperto da nm
(forse perché sono collegamenti simbolici?), Che emette un bel po 'di messaggi di errore (che non mi piacciono neanche).
Il fatto è che ldd
(o ld
?) Probabilmente esegue alcune di queste ricerche di simboli, ma ho provato le rispettive manpage e non riesco a vedere un modo per "trovare" alcun simbolo dalla riga di comando, senza fornire una sorta di file eseguibile come un discussione. Domanda a margine: ci sarebbe un modo per usare questi strumenti per quello?
Quindi, quello che sto cercando uno strumento da riga di comando, che si comporterebbe in qualche modo (pseudocodice):
$ ./findsymbol '_Zls6QDebugN13QGraphicsItem16GraphicsItemFlagE'
symbol found in:
/usr/lib/libQtGui.so.4.7.2:00766d70 T _Zls6QDebugN13QGraphicsItem16GraphicsItemFlagE
...
... dove non specifico alcuna directory da cercare - ma che gestisca anche, ad esempio LD_PRELOAD
o LD_LIBRARY_PATH
; dire se lo faccio:
$ LD_PRELOAD="/path/to/mylib.so" ./findsymbol '*mylib_print*'
... poi otterrei il punto in /path/to/mylib.so
cui è stato definito il simbolo dato (dato che un tale simbolo non esisterebbe nelle librerie standard) e altrimenti produrrebbe "non trovato". E altrimenti, ./findsymbol --dumpall
potrebbe produrre un elenco di tutti i simboli disponibili e le loro posizioni viste da un determinato ambiente (ad esempio una bash
shell specifica ).
Esiste uno strumento come questo per Linux?