2012-09-04 11 views
7

Ich schreibe ein Programm elfdump -ecpsELF Symboltabelle Zugriff in C

Es ist derzeit die Elf-Header, Programmknöpfe druckt zu imitieren, und richtig Abschnittsüberschriften, aber ich bin auf den letzten Teilen des stucks Symboltabelle.

die gewünschte Ausgabe ist im Format:

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 
... 

können Sie mir sagen, wo der oth, ver, shndx und Namen zu finden sind?

so weit, Ich drucke es aus mit dem folgenden:

//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 

} 

Ich habe durch http://docs.oracle.com/cd/E19457-01/801-6737/801-6737.pdf (Kapitel 5) zu lesen, aber nicht in der Lage etwas hilfreich

+0

können Sie mit uns Ihren Code teilen, der Elfdump nachahmt? –

Antwort

11

Dies wird meistens unter Symbol Table ab Seite 119 des Dokuments, auf das Sie verlinken, behandelt.

Es tatsächlich hat die Struktur, die Sie brauchen:

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; 

zusammen mit Informationen darüber, wie die Informationen für verknüpften Einträge finden (insbesondere die Mittel für die Suche nach den Namen von dem st_name Strukturfeld).

Leider das Dokument scheint nicht zu decken, wo bestimmte Dinge herkommen (Version, zum Beispiel), so, wenn ich versuche, ein anderes Programm zu emulieren, die die Quelle zur Verfügung hat, ich-the source zu gehen - dort wirklich ist nichts definitiver als das :-)

Ab Zeile 1665 dieser Datei finden Sie die elf_print_symtab() Funktion, die für die Ausgabe der Informationen, die Sie interessiert sind, verantwortlich ist. Es ruft get_versym(), um diese Informationen zu erhalten und von diesem Code in Zeile 1632 können Sie sehen, dass es einen anderen Abschnitt dafür verwendet (version symbol section).

Und, wie man sehen kann here, dieser Abschnittstyp gilt als eine der Betriebssystem-spezifischen, weshalb Sie es nicht in der Basis-Standard finden, die sich nur mit den üblichen Sachen befasst.

0

Für Namen zu finden, gibt ist ein weiterer Abschnitt, der alle Zeichenfolgen enthält. Sie sollten das erste Feld in "Section Header Table" als Index in der Abschnittsüberschrift verwenden, um die echte Zeichenfolge aus diesem String-Abschnitt zu erhalten. Sie können viele Artikel dazu mit Google finden.