2017-02-25 6 views
0

Je suis en fait recoder le programme nm et objdump. J'ai déjà fini objdump et cela fonctionne bien, donc je travaille sur nm maintenant. Je suis en train de trouver la table Symbole , afin de le faire que je cours à travers la section Table d'en-tête comme ceci:Vous ne trouvez pas le symbole tableau (format Elf) (programmation C)

while (i < elf->e_shnum) 
{ 
    if (shdr[i].sh_type == SHT_SYMTAB) 
     printf("Symbol table found\n"); 
    i++; 
} 

Je lance jamais par cette condition, déjà essayé dans mon programme objdump et le même problème, ne peut pas trouver SHT_SYMTAB.

Voici comment je reçois la table d'en-tête Section:

Elf64_Shdr *shdr; 
unsigned char *shstrtab; 
void   *data; 
Elf64_Ehdr *elf; 

//I reduced the code to make it more readable 
data = mmap(NULL, filesize(fd), PROT_READ, MAP_SHARED, fd, 0); 
elf = ((Elf64_Ehdr *)data); 
shdr = ((Elf64_Shdr *)(data + elf->e_shoff)); 
shstrtab = ((unsigned char *)(data + shdr[elf->e_shstrndx].sh_offset)); 

Je ne sais pas si je le fais à droite (même si mon objdump fonctionne parfaitement), ou si je ne comprenais pas comment nm fonctionne

Merci pour l'aide :)

+0

Je remplace effectivement le pointeur de données par le Ehdr coulé dans void *, ne fonctionne toujours pas – Drumz

Répondre

1

Je ne sais pas si je le fais droit

Ce:

shdr = ((Elf64_Shdr *)(data + elf->e_shoff)); 

ajoute .e_shoff à un pointeur void*, qui invoque undefined behavior.

Cependant, GCC treats arithmetic sur void* comme si elle était un char*, donc le code ci-dessus devrait encore produire un résultat correct ssi vous avez compilé avec GCC.

Votre première étape devrait être de vérifier que le fichier que vous essayez d'exécuter votre programme sur a fait section SHT_SYMTAB (s) en exécutant readelf -WS /path/to/file.

Si l'on suppose qu'il ne, votre deuxième étape devrait être de vérifier (dans un débogueur, ou en imprimant shdr et data) que les shdr vous matchs calculés Start of section headers imprimés par readelf -h /path/to/file.

P.S. Notez que les fichiers ELF entièrement dénudés n'ont pas de section SYMTAB (ce n'est pas obligatoire pour l'exécution).

+0

J'ai trouvé le problème, je quittais ma fonction lorsque mon adresse (donnée par data + shdr [i] ._ sh_offset) était égale à mon shstrtab (qui n'est pas la fin du fichier ELF). Mais merci pour les conseils sur void * :) – Drumz

+1

@Drumz "je quittais ma fonction" - et c'est pourquoi vous devriez toujours essayer de fournir un exemple minimal complet (http://stackoverflow.com/help/mcve) - - Le problème n'était pas dans le code que vous avez montré, donc personne ne pouvait deviner où c'était. –