studio reales proyectos programacion libro introducción incluye herramientas fundamentos fuente español código con avanzado aplicaciones c linux shared-libraries elf objdump

reales - ¿Cómo puedo saber qué funciones de un objeto compartido utilizan un programa u otra biblioteca?



libro de android studio en español pdf (5)

¿Has mirado ltrace ? Intercepta llamadas a las funciones de la biblioteca compartida en tiempo de ejecución e imprime información sobre ellas a medida que ocurren.

Dado que esta es una solución dinámica, no imprimiría ninguna información para una llamada de biblioteca realizada en parte de su programa que nunca se ejecuta. Pero podría ser útil dependiendo de sus necesidades.

¿Cómo puedo saber qué funciones de un objeto compartido utilizan un programa u otra biblioteca? En este caso específico, me gustaría ver qué funciones en /lib/libgcc1_s.so.1 están siendo utilizadas por otra biblioteca dinámica. Dado que están vinculados dinámicamente, objdump -d no resuelve las direcciones de llamada de función. ¿Hay alguna manera de ejecutar el programa en un depurador o volver a vincular estáticamente? Gracias,

Luca

Editar:

nm y readelf no funcionan, no necesito ver qué símbolos están presentes en un objeto compartido, sino que en realidad se usan en otro objeto que se enlaza con él.


Esto se puede lograr usando una técnica llamada análisis estático en ingeniería inversa.

Necesitas un desensamblador para esto. Ver http://en.wikipedia.org/wiki/Disassembler

IDA PRO es un buen desensamblador que responde a su pregunta. Es capaz de leer el formato de archivo ELF, pero desafortunadamente no es gratis.


No conozco uno, incluso nm tiene un uso limitado para lo que parece que pretendes. Además, la precarga (del enlazador GNU) podría invalidar cualquier suposición que haga después de usar una herramienta que supuestamente podría hacer eso. Ver la página del manual de ld.so. LD_PRELOAD puede utilizar LD_PRELOAD para anular la resolución de los símbolos, ya que se produciría en circunstancias normales.

Sin embargo, incluso sin un depurador, puede utilizar LD_DEBUG para ver qué función se está utilizando en última instancia.


Tal vez la herramienta nm pueda ayudarle, ya que muestra los nombres de los símbolos contenidos en un archivo binario.
Es tan simple como ABC de usar:

nm my_binary


nm solo funcionará si la biblioteca no fue despojada de sus símbolos. Sin embargo, nm -D podría mostrarte algo de información:

nm -D /lib/libgcc_s.so.1

Pero hay otra herramienta que puede ayudarte: readelf

readelf - Muestra información sobre los archivos ELF.

Y si verifica las páginas del manual, opción -s : Displays the entries in symbol table section of the file, if it has one.

readelf -s /lib/libgcc_s.so.1

EDITAR:

Bueno, los símbolos que no están implementados dentro del objeto que está inspeccionando con nm aparecerán con una bandera U delante de él, pero nm no le dirá qué biblioteca de su sistema implementa ese símbolo.

Entonces, lo que está buscando puede lograrse con una mezcla de ldd y nm . ldd le dice a qué bibliotecas está vinculada su aplicación, y nm le dice qué símbolos están indefinidos (marca U ) o implementados localmente (bandera T ).

Después de enumerar todos los símbolos indefinidos (con nm) en la aplicación de destino, debe iterar a través de todas las bibliotecas reportadas por ldd en busca de esos símbolos (usando nm nuevamente). Si encuentra el símbolo y está precedido por la marca T, lo encontró.

Por cierto, acabo de escribir esta frase para que bash ilustre mi idea. Analiza una aplicación llamada win e intenta encontrar las bibliotecas que implementan todos los símbolos informados como no definidos.

target="win"; for symbol in $(nm -D $target | grep "U " | cut -b12-); do for library in $(ldd $target | cut -d '' '' -f3- | cut -d'' '' -f1); do for lib_symbol in $(nm -D $library | grep "T " | cut -b12-); do if [ $symbol == $lib_symbol ]; then echo "Found symbol: $symbol at [$library]"; fi ; done; done; done;

O, si su terminal soporta colores:

target="win"; for symbol in $(nm -D $target | grep "U " | cut -b12-); do for library in $(ldd $target | cut -d '' '' -f3- | cut -d'' '' -f1); do for lib_symbol in $(nm -D $library | grep "T " | cut -b12-); do if [ $symbol == $lib_symbol ]; then echo -e "Found symbol: /e[1;36m$symbol/033[0m at /e[1;34m$library/033[0m"; fi ; done; done; done;

Estoy seguro de que alguien encontrará una mejora en el rendimiento.

Salidas:

Found symbol: XCreateColormap at [/usr/lib/libX11.so.6] Found symbol: XCreateWindow at [/usr/lib/libX11.so.6] Found symbol: XIfEvent at [/usr/lib/libX11.so.6] Found symbol: XMapWindow at [/usr/lib/libX11.so.6] Found symbol: XOpenDisplay at [/usr/lib/libX11.so.6] Found symbol: __libc_start_main at [/lib/tls/i686/cmov/libc.so.6] Found symbol: __stack_chk_fail at [/lib/tls/i686/cmov/libc.so.6] Found symbol: glClear at [/usr/lib/mesa/libGL.so.1] Found symbol: glClearColor at [/usr/lib/mesa/libGL.so.1] Found symbol: glFlush at [/usr/lib/mesa/libGL.so.1] Found symbol: glXChooseFBConfig at [/usr/lib/mesa/libGL.so.1] Found symbol: glXChooseVisual at [/usr/lib/mesa/libGL.so.1] Found symbol: glXCreateContext at [/usr/lib/mesa/libGL.so.1] Found symbol: glXCreateNewContext at [/usr/lib/mesa/libGL.so.1] Found symbol: glXCreateWindow at [/usr/lib/mesa/libGL.so.1] Found symbol: glXGetVisualFromFBConfig at [/usr/lib/mesa/libGL.so.1] Found symbol: glXMakeContextCurrent at [/usr/lib/mesa/libGL.so.1] Found symbol: glXMakeCurrent at [/usr/lib/mesa/libGL.so.1] Found symbol: glXQueryVersion at [/usr/lib/mesa/libGL.so.1]