La plataforma de prueba es Linux de 32 bits.
Compilo el programa ac sin eliminar la información del símbolo y uso objdump para desensamblar el archivo ejecutable elf.
Aquí está parte de los resultados.
804831c: e8 8c fe ff ff call 8048360 <printf@plt>Si uso:
strip binarypara eliminar la información del símbolo y usar objdump para desensamblar el archivo ejecutable elf nuevamente, todavía puedo ver los resultados como:
804831c: e8 8c fe ff ff call 8048360 <printf@plt>Entonces mi pregunta es:
¿Cómo puede una herramienta de desmontaje como objdump saber el nombre de ciertas funciones de la biblioteca después de haber eliminado toda la información del símbolo?
¡Gracias!
El archivo ELF tiene 2 tablas de símbolos: .symtab y .dynsym. Este último es para los símbolos dinámicos necesarios para la vinculación dinámica (reubicación). En su caso, printf está en .dynsym y también puede estar presente en .symtab; por defecto, strip eliminaría .symtab pero no .dynsym, que es necesario para la reubicación.
puedes intentar
tira -R .dynsym tu_binario
para eliminar la sección dynsym manualmente y encontrará que no se ejecuta debido a una falla de reubicación.
Las llamadas importadas siempre tendrán el nombre, es necesario vincular en tiempo de ejecución. Si eliminó el nombre de importación, ¿cómo sabría su aplicación a qué llamar? Los métodos de bibliotecas externas pueden (y generalmente lo hacen) tener una dirección diferente cada vez que se ejecuta su aplicación.
En otra nota, los métodos en línea o vinculados estáticamente a veces se pueden identificar y nombrar incluso sin información de símbolos. Muchos desensambladores buscan patrones comunes asociados con algunas funciones de biblioteca estándar. memcpy() , por ejemplo, a menudo se puede identificar y etiquetar heurísticamente incluso sin información de símbolo disponible.