Básicamente, se trata de dos preguntas en una, porque si puedo enumerar todos los símbolos exportados dentro de un sistema, junto con su ruta de biblioteca compartida, entonces podría simplemente grep
esa salida.
Para los símbolos del núcleo, supongo que es algo más fácil, porque siempre podemos cat /proc/kallsyms
obtener una lista de todos los símbolos de esos módulos cargados en la memoria; luego sudo cat /proc/modules
dará una lista de los módulos cargados con sus direcciones, pero no las rutas desde donde se han cargado los módulos (si están construidos como objetos .ko fuera del árbol)
Por ejemplo, trato de rastrear el programa 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
...
... y me gustaría saber dónde _ZNK13QGraphicsItem10parentItemEv
reside esto .
Entonces, ¿qué hacer con los símbolos de biblioteca compartida? Lectura a través de [gcc-help] Re: encontrar la biblioteca en la que se define el símbolo. ; Intenté algo como esto:
$ 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
...
... pero eso me da problemas adicionales: realmente no conozco todas las rutas que se analizan en busca de bibliotecas compartidas en mi sistema, así que cuando lo intenté por primera find /lib ...
vez no encontré nada; Me resulta molesto esta suposición de directorios, así como la alternativa: escanear todo el sistema de archivos raíz con find
... Y también, parece que golpeo * .so's, que no puede abrirse nm
(¿tal vez porque son enlaces simbólicos?), Que genera una cantidad considerable de mensajes de error (que tampoco me gustan).
La cuestión es que ldd
( ld
¿ o ?) Probablemente realiza parte de esta búsqueda de símbolos, pero probé las páginas de manual respectivas y no puedo encontrar una manera de "encontrar" ningún símbolo de la línea de comandos, sin proporcionar algún tipo de archivo ejecutable como argumento. Pregunta secundaria: ¿habría alguna forma de usar estas herramientas para eso?
Entonces, lo que estoy buscando es una herramienta de línea de comandos, que se comportaría de manera similar a (pseudocódigo):
$ ./findsymbol '_Zls6QDebugN13QGraphicsItem16GraphicsItemFlagE'
symbol found in:
/usr/lib/libQtGui.so.4.7.2:00766d70 T _Zls6QDebugN13QGraphicsItem16GraphicsItemFlagE
...
... donde no especifico ningún directorio para buscar, pero que también manejaría, por ejemplo, LD_PRELOAD
o LD_LIBRARY_PATH
; decir si lo hago:
$ LD_PRELOAD="/path/to/mylib.so" ./findsymbol '*mylib_print*'
... luego obtendría el lugar /path/to/mylib.so
donde se definió el símbolo dado (dado que dicho símbolo no existiría en las bibliotecas estándar) y, de lo contrario, generaría "no encontrado". Y de lo contrario, ./findsymbol --dumpall
podría producir una lista de todos los símbolos disponibles y sus ubicaciones vistas desde un entorno determinado (por ejemplo, un bash
shell específico ).
¿Existe una herramienta como esta para Linux?