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?
fuente
scanelf
permite especificar directorios específicos para buscar y admitir la búsqueda recursiva-r
para que pueda modificar sus rutas de búsqueda o buscar en todo su sistema sin demasiados problemas. Por ejemploscanelf -r -s SYMBOL /lib/* /usr/* /opt/*
, encontrará la mayoría de los lugares donde se esconden las bibliotecas.En los sistemas GNU (cuando se utiliza el enlazador dinámico libc de GNU), puede ejecutar su programa como:
Para encontrar dónde se resuelven los símbolos.
fuente
Me he encontrado con esto varias veces, intentando portar código de un sistema Linux a otro. Por lo general, termino grep'ing todos los directorios estándar. No pude encontrar nada buscando en Google. Así que aquí hay un guión rápido:
edt11x / findinsharedlibs
fuente