linux nm readelf

linux - nm vs "readelf-s"



(1)

¿Por qué nm no da ningún resultado para striped libtest.so

Hay dos tablas de símbolos en la libtest.so original: una "regular" (en las secciones .symtab y .strtab ) y una dinámica (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. De modo que 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 "normal" solo es útil 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.

Supongamos que tenemos una biblioteca compartida llamada libtest.so, hay una función "foo" en ella

usa la tira para descartar todos los símbolos de libtest.so

$strip libtest.so

Entonces, ahora si usamos:

$nm libtest.so

se imprimirá:

nm: libtest.so: sin símbolos

pero si usamos:

$readelf -s libtest.so

la función foo aún puede verse a partir de su resultado:

...

10: 000005dc 5 FUNC GLOBAL DEFAULT 12 _Z3foov

...

también podemos usar cadenas de comandos para verificarlo:

$strings libtest.so

...

_Z3foov

...

aquí está mi pregunta, ¿por qué nm no dan ningún resultado para libtest.so rayado?

Gracias