2013-01-17 29 views
0

我想讀取一個ELF文件的內容到內存中使用C.我目前可以讀取1個程序頭文件很好,但我有一個問題比這更多。在ELF文件中的多個程序頭文件

/* Find and read program headers */ 
    ELFPROGHDR *prgHdr; 

    fseek(fp, elfhead.phdrpos, SEEK_SET); 
    prgHdr = (ELFPROGHDR*)malloc(sizeof(ELFPROGHDR)*elfhead.phdrcnt); 
    if(!prgHdr) 
    { 
     fprintf(fp, "Out of Memory\n"); 
     fclose(fp); 
     return 3; 
     } 

    fread(prgHdr, 1, sizeof(ELFPROGHDR)*elfhead.phdrcnt, fp); 
    printf("Segment-Offset: %x\n", prgHdr->offset); 
    printf("File-size: %d\n", prgHdr->filesize); 
    printf("Align: %d\n", prgHdr->align); 

/* allocate memory and read in ARM instructions */ 

    for(i = 0; i < elfhead.phdrcnt; i++) 
    { 
     armInstructions = (unsigned int *)malloc(prgHdr->filesize + 3 & ~3); 
     if(armInstructions == NULL) 
    { 
     fclose(fp); 
     free(prgHdr); 
     fprintf(stderr, "Out of Memory\n"); 
     return 3; 
    } 
     fseek(fp, prgHdr->offset, SEEK_SET); 
     fread(armInstructions, 1, prgHdr->filesize, fp); 

/* Disassemble */ 
     printf("\nInstructions\n\n"); 

     Disassemble(armInstructions, (prgHdr->filesize + 3 & ~3) /4, prgHdr->virtaddr); 
     printf("\n"); 
     free(armInstructions); 
    } 
    free(prgHdr); 

我想我遇到的問題是與

fseek(fp, elfhead.phdrpos, SEEK_SET); 

由於我只求每次第一個程序報頭的開始。我怎麼會這樣,我求第一頭部,然後是第二頭等等的開始,每次..

感謝

改變

回答

0

你的代碼是非常糟糕的:-(

你做以下內容:

for i in phdrcnt 
    fseek(phdrpos); 
    prgHdr[i] = malloc space for *all* phdrs 
    fread() *all* phdrs into the allocated space 
    use first phdr to disassemble 
    free allocated space 

換句話說,你分配了N次,FREAD N次,拆開N次相同的第一PHDR,免費N次

你想要什麼inste。廣告:

fseek(phdrpos) 
prgHdr = malloc space for all phdrs 
fread all phdrs into space allocated 
for i in phdrcnt 
    disassemble(pgrHdr[i]) 
free(pgrHdr) 
+0

感謝您的幫助。雖然有些困惑。你對所有的phdrs說prgHdr = malloc,但後來說反彙編(prghdr [i])。你建議PrgHdr是一個數組還是不是?謝謝 – BradStevenson

+0

「你是在暗示PrgHdr是一個數組還是不是?」 - 請閱讀有關指針運算的知識,例如在這裏:http://www.learncpp.com/cpp-tutorial/68-pointers-arrays-and-pointer-arithmetic/關鍵:「注意*(anArray + 1)與anArray [1]具有相同的效果。 「 –