2011-08-18 15 views
9

Estaba buscando interpretar la tabla de símbolos dinámicos (.dynsym) de un archivo ejecutable ELF. Pude interpretar correctamente la tabla de símbolos .symtab (16 bytes para cada símbolo) utilizando el atributo 'valor' para indicar la dirección del símbolo y el atributo 'nombre' para indicar el desplazamiento del inicio de la cadena en .strtab sección. Pero no puedo interpretar la tabla de símbolos dinámicos (.dynsym) usando el mismo método. Utilicé el blog de Ali [1] como referencia.¿Cómo interpretar la tabla de símbolos dinámicos en un ejecutable ELF?

Miré en otro blog de Ali [2] pero no entiendo cómo interpretar la tabla de símbolos dinámicos usando la tabla hash. Claramente, no es el mismo mapeo utilizado por la tabla de símbolos. ¿Cómo debería interpretar la tabla de símbolos dinámicos (.dynsym)?

Además, el ejecutable ELF, que estoy mirando tiene dos secciones, a saber .hash y .gnu.hash. ¿Qué sección recomiendo para los valores hash?

[1] http://blogs.oracle.com/ali/entry/inside_elf_symbol_tables
[2] http://blogs.oracle.com/ali/entry/gnu_hash_elf_sections

Gracias y Saludos,
Hrishikesh Murali

+0

De acuerdo, he esperado un día para recibir un comentario/respuesta pero no tengo ninguno. ¿Qué concluyo?: -/ –

Respuesta

2

Pero soy incapaz de interpretar la tabla de símbolos dinámicos (.dynsym) usando el mismo método.

Debería buscar cadenas en la sección ".dynstr".

Además, el ejecutable ELF que estoy viendo tiene dos secciones, a saber .hash y .gnu.hash. ¿Qué sección recomiendo para los valores hash ?

Depende del tipo de símbolo que desea buscar. Por lo que sé, Las tablas hash de estilo GNU solo contienen información relevante para el enlace dinámico.

Vea también: Jakub Jelinek's description of GNU hash tables, publicado en GNU binutils mailing list.

3

De especificación ELF, cada símbolo se define usando la siguiente estructura:

typedef struct { 
     Elf32_Word 
     Elf32_Addr 
     Elf32_Word 
     unsigned char 
     unsigned char 
     Elf32_Half 
} Elf32_Sym; 

Así, en general, este será de 16 bytes. La tabla de símbolos dinámica y estática utiliza la misma estructura, por lo que analizar esta tabla es la misma para estáticos y enlaces. Por supuesto, el significado de los valores no es siempre el mismo.

Puede alcanzar un símbolo en la tabla de símbolos de dos maneras. Primero, si ya conoce el índice de símbolos, puede ir a ese índice. Pero algunas veces no tiene el índice de símbolos, solo tiene un nombre de símbolo y, de hecho, desea verificar si la tabla de símbolos tiene una definición para un símbolo con ese nombre. En esta segunda situación, usa las secciones hash. Ésos se utilizan para verificar rápidamente si un símbolo está presente en una tabla de símbolos: nombre-símbolo -> hash -> índice_de_miembros -> verificar si tabla_de_memoria [índice_de símbolos] == nombre-símbolo.

+0

Esto es incorrecto, porque * Elf32_Half * es de 2 bytes, no 4, dando: 4 + 4 + 4 + 1 + 1 + 2 = 16 bytes. Además, puede valer la pena señalar que con * ELFCLASS64 * (x86-64), esto es 24 bytes. – krb686

+0

Creo que tienes razón. Voy a corregir – JohnTortugo

Cuestiones relacionadas