2012-04-27 10 views
7

attualmente sto scrivendo piccolo programma che legge intestazione del file elfo e stampa alcune informazioniReading ELF in C

Ho un puntatore unsigned char chiamato buf che indica la posizione in cui file di elfo si trova in memoria (I usato mmap per mappare a memoria), poi ho typecast a un corretto puntatore intestazione elfo

Elf32_Ehdr *ehdr = (Elf32_Ehdr *)buf; 

Dopo questo, io voglio ottenere un indirizzo della tabella intestazione del programma, lo faccio come questo

Elf32_Phdr *ptbl = (Elf32_Phdr *) (buf + ehdr->e_phoff) 

Come ho notato il valore del puntatore PTBL non cambia e quando provo a stampare il valore del membro e_phoff come questo

fprintf(stdout , "Offset of program headers : %d\n", ehdr->e_phoff); 

ottengo a zero stessa roba accade quando si tenta di stampare il numero di programma intestazioni e numero di sezione headers - diventano sempre zero Se io uso linux readelf, stampa i valori corretti qualcuno sperimentato lo stesso problema?

+3

Penso di aver trovato il problema, sto usando una macchina a 64 bit, quindi ho appena cambiato Elf32_Phdr in Elf64_Phdr e ha funzionato –

+0

Vai avanti e rispondi alla tua stessa domanda. È una cosa valida da fare, se trovi prima la risposta. Ovviamente, è stato utilizzato il tipo di puntatore struct sbagliato, quindi si stava riferendo la memoria a monte di quello previsto. –

+0

Suggerisco di usare libelf. –

risposta

5

Durante l'analisi di un oggetto ELF, si avrebbe bisogno di tenere a mente che:

  1. Le dimensioni, l'allineamento del file e il layout interno per strutture in file (come l'ELF eseguibile Header) dipende dalla ELF dimensione della parola dell'oggetto
  2. L'endianness dell'oggetto ELF potrebbe differire dalla endianness 'native' del programma di lettura dell'oggetto.
  3. oggetti ELF contenenti un gran numero di sezioni o segmenti di programma possono utilizzare uno schema alternativo "esteso numerazione".

Anziché gestire questi casi a mano, può essere più facile da usare un'implementazione della ELF (3) accesso API per analizzare l'oggetto ELF (vedi: BSD libelf, o GNU libelf).

Il tutorial `` libelf by Example '' contiene un'introduzione leggibile per l'ELF (3) API.

+0

Grazie uomo, ben Stavo solo giocando con questo esempio per ottenere una sensazione più vicina di ciò che è ELF, Comunque grazie link utili –