2012-04-01 14 views
30

Supongamos que tenemos una biblioteca compartida llamada libtest.so, hay una función "foo" en ellanm vs "readelf -s"

utilizar la tira a los descartes todos los símbolos de libtest.so

$strip libtest.so 

es así, ahora si usamos:

$nm libtest.so 

lo que imprimirá:

nm: libtest.so: no hay símbolos

pero si usamos:

$readelf -s libtest.so 

función foo todavía se puede ver a partir de su resultado:

...

10: 5 000005dc FUNC global predeterminada 12 _Z3foov

...

también podemos usar cadenas de comandos para verificarlo:

$strings libtest.so 

...

_Z3foov

...

aquí es mi pregunta, ¿por qué no dar nm resultado para libtest.so rayas?

Gracias

Respuesta

48

qué nm dan ningún resultado para rayas libtest.so

Hay dos tablas de símbolos en el original libtest.so: un "regular" uno (en .symtab y .strtab secciones) y uno dinámico (en las secciones .dynsym y .dynstr).

Si strip eliminó ambas tablas de símbolos, su biblioteca sería completamente inútil: el cargador dinámico no podría resolver ningún símbolo en ella. Entonces, strip hace lo único que tiene sentido: elimina la tabla de símbolos "normal", dejando la dinámica intacta.

Puede ver símbolos en la tabla de símbolos dinámicos con nm -D o readelf -s.

La tabla de símbolos "normales" es útil solo para la depuración (por ejemplo, contiene entradas para funciones estáticas, que no son exportadas por la biblioteca, y no aparecen en la tabla de símbolos dinámicos).

Pero el cargador dinámico nunca mira la tabla de símbolos "normal" (que no está en un formato adecuado para búsquedas rápidas de símbolos); solo en el dinámico. Por lo tanto, la tabla de símbolos "regulares" no es necesaria para la operación correcta del programa, pero la dinámica sí lo es.

+1

Su nombre de usuario es asombroso. Así que, básicamente, si vinculo una biblioteca estática con un binario en tiempo de compilación, los símbolos de la biblioteca aparecerán con nm, pero si hago un enlace dinámico, los símbolos aparecerán en readelf -S y nm -D, ¿correcto? – acib708

+0

@ AlejandroCárdenas No creo que tu comprensión sea del todo correcta. Además, existe una diferencia entre 'readelf -s' y' readelf -S'. Probablemente sea mejor hacer una pregunta por separado. –

+0

Sí, lo siento, quise decir readelf -s. Bueno, la pregunta principal sigue siendo, no entiendo la diferencia entre nm y readelf -s ya que me dices que lo que entendí es incorrecto. ¿Te gustaría elaborar un poco más, por favor? – acib708

Cuestiones relacionadas