2011-05-10 3 views
12

¿Cómo se puede extraer los tamaños de todas las estructuras de C desde un archivo de objeto ELF con símbolos de depuración?de dumping C tamaños de estructura de archivo de objeto ELF

Los tamaños de estructuras individuales se pueden obtener de GDB usando "print sizeof (some_struct)", pero lo que necesito es obtener una lista de todas las estructuras.

He visto "nm" y "objdump", pero no veo opciones para hacer lo que estoy buscando. ¿Hay alguna manera de hacer esto con las herramientas estándar de Unix, o necesito extraer la sección del símbolo de depuración del archivo ELF y procesarla yo mismo? Espero que no sea esto último.

Gracias de antemano por cualquier consejo. Ray

Respuesta

0

A menos que alguien más sepa algo, creo que tendrá que procesar la salida de nm.

Sin embargo, nm solo le da el inicio de cada estructura y no sabe nada acerca de su final, por lo que incluso eso puede no funcionar a menos que cada punta sea seguida inmediatamente por algún otro símbolo. ¡Cuidado con este problema!

+0

Gracias por la respuesta, pero no puedo obtener nm para enumerar ningún tipo (es decir, estructuras), solo símbolos con direcciones. –

11

Tendrás que excavar en la sección .debug_info, objdump lo vaciará por ti si lo ejecutas con --dwarf parámetro.

Verá sus estructuras allí como * DW_TAG_structure_type * y * DW_AT_byte_size * atributo es equivalente a sizeof. La herramienta estándar de Unix debería ser suficiente para formatear esta información en una lista más legible.

+0

Muchas gracias, esto funciona muy bien. Ahora solo necesito escribir un script Perl para procesar el resultado. –

+0

@Ray Balogh Puede que le interese pstruct, un script de Perl que hace algo similar. http://perldoc.perl.org/pstruct.html – sigjuice

+0

¡es muy útil, increíble! –

3

Instale enanos paquete, entonces usted tiene el comando "hoyo".

uso del "pahole" comando en un archivo de objeto Elf, se puede obtener toda la información de estructura, o puede utilizar el parámetro "-C" a un nombre específico de la estructura, por ejemplo:

$ pahole vmlinux -C task_struct

Cuestiones relacionadas