2012-09-04 18 views
7

Estoy escribiendo un programa para imitar elfdump -ecpsAcceso a la tabla de símbolos ELF en C

actualidad imprime la cabecera ELF, cabeceras de programas, y encabezados de sección correctamente, pero estoy atascado en los últimos partes de la tabla de símbolos.

la salida deseada es en el formato de:

Symbol Table Section: .dynsym 
index value  size  type bind oth ver shndx   name 
    [0] 0x00000000 0x00000000 NOTY LOCL D 0 UNDEF   
    [1] 0x00025c0c 0x00000000 FUNC GLOB D 2 UNDEF   .udiv 
    [2] 0x00025e00 0x00000140 OBJT WEAK D 1 .bss   _iob 
    [3] 0x00025b24 0x00000000 OBJT GLOB P 1 .got   _GLOBAL_OFFSET_TABLE_ 
    [4] 0x00013a44 0x0000001c FUNC GLOB D 1 .init   _init 
... 

puede decirme dónde se encuentran el OTH, ver, shndx, y el nombre?

hasta ahora, estoy imprimiendo a cabo con los siguientes:

//for each entry in the symbol table 
for(i=0; i<num_sym; i++) 
{ 
    //read the current symbol 
    fread(&mysym,sizeof(Elf32_Sym),1,fp); 
idx=mysym.st_name; 

    //multiple lines to get formatting correct 
    //prints index in brackets right aligned 
    char buf[12]; 
    sprintf(buf, "[%d]", i); 
    printf("%10s", buf); 

    //value 
    printf(" 0x%.8x", mysym.st_value); 
    //size 
    printf(" 0x%.8x", mysym.st_size); 

    //type 
    switch (ELF32_ST_TYPE(mysym.st_info)) { 
     case 0: 
      printf(" NOTY"); 
      break; 
     case 1: 
      printf(" OBJT"); 
      break; 
     case 2: 
      printf(" FUNC"); 
      break; 
     case 3: 
      printf(" SECT"); 
      break; 
     case 4: 
      printf(" FILE"); 
      break; 

     default: 
      break; 
    } 

    //bind 
    switch(ELF32_ST_BIND(mysym.st_info)) 
    { 
     case 0: printf(" LOCL"); 
      break; 
     case 1: printf(" GLOB"); 
      break; 
     case 2: printf(" WEAK"); 
      break; 
     case 3: printf(" NUM"); 
      break; 

     default: 
      break; 
    } 
    //TODO: oth 
    //TODO: ver 
    //TODO: shndx 
    //TODO: name 

} 

He estado leyendo a través http://docs.oracle.com/cd/E19457-01/801-6737/801-6737.pdf (capítulo 5), pero no he podido encontrar nada útil

+0

¿puedes compartir con nosotros tu código que imita a elfdump? –

Respuesta

11

Esto se cubre principalmente en Symbol Table a partir de la página 119 de ese documento al que se vincula.

En realidad tiene la estructura que necesita:

typedef struct { 
    Elf32_Word st_name; 
    Elf32_Addr st_value; 
    Elf32_Word st_size; 
    unsigned char st_info; 
    unsigned char st_other; 
    Elf32_Half st_shndx; 
} Elf32_Sym; 

junto con los detalles sobre cómo encontrar la información para entradas vinculadas (específicamente los medios para encontrar el nombre del campo st_name estructura).

Por desgracia, no parece que el documento para cubrir donde ciertas cosas vienen de (la versión, por ejemplo) para, cuando estoy tratando de emular a otro programa que tiene la fuente disponible, me voy a the source - hay realmente no es nada más definitivo que eso :-)

a partir del 1665 la línea de ese archivo, encontrará la función elf_print_symtab(), que se encarga de dar salida a la información que le interesa. se llama get_versym() para conseguir que la información y, a partir de ese código en la línea 1632, puede ver que usa una sección diferente para eso (el version symbol section).

Y, como se puede ver here, ese tipo de sección se considera uno de los específicos del sistema operativo, por lo que no lo encontrará en el estándar base, que se refiere solo a las cosas en común.

0

En Nombre, allí es otra sección que contiene todas las cadenas. Debe usar el primer campo en "Tabla de encabezado de sección" como índice en el encabezado de sección para obtener la cadena real de esta sección de cadena. Puedes encontrar muchos artículos sobre esto con google.