2016-03-27 7 views
0

私はこのガイドに従っています:http://wiki.osdev.org/ELF_Tutorialを処理するelf filesです。指定されたファイルは、(それがあることを示すreadelfにもかかわらず)正しいELFないことCでのelfファイルを読む正しい方法

しかし、機能bool elf_check_fil状態、

コード:

:ファイルをロード

bool elf_check_file(Elf32_Ehdr *hdr) { 
    if(!hdr) return false; 
    if(hdr->e_ident[EI_MAG0] != ELFMAG0) { 
     ERROR("ELF Header EI_MAG0 incorrect.\n"); 
     return false; 
    } 
    if(hdr->e_ident[EI_MAG1] != ELFMAG1) { 
     ERROR("ELF Header EI_MAG1 incorrect.\n"); 
     return false; 
    } 
    if(hdr->e_ident[EI_MAG2] != ELFMAG2) { 
     ERROR("ELF Header EI_MAG2 incorrect.\n"); 
     return false; 
    } 
    if(hdr->e_ident[EI_MAG3] != ELFMAG3) { 
     ERROR("ELF Header EI_MAG3 incorrect.\n"); 
     return false; 
    } 
    return true; 
} 

FILE* elf = fopen(argv[1], "r"); Elf32_Ehdr *hdr = (Elf32_Ehdr *) elf; elf_check_file(hdr); 

gdb I ch実際にはhdr->e_ident[EI_MAG0] ... hdr->e_ident[EI_MAG3]には正しいマジックナンバーが含まれていません。どうして?

+5

'elf_check_file'はファイルハンドル、エルフファイルの内容を期待していません。 'FILE *'を 'Elf32_Ehdr *'にキャストすることはできません。あなたはその内容を読む必要があります。 – aragaer

+5

ファイルを* text *ファイルとして開くという問題もあります。 –

+3

あなたは 'rb'が必要です。エルフはバイナリです。トロールと爆弾は、テキストとして開くことはできますが、エルフは開くことはできません。 –

答えて

1

複数のコメントに記載されているとおり、elf_check_fileは正しく使用されていません。

正しい方法はこのようなものでなければなりません:

FILE *fp = fopen(argv[1], "rb"); 
if (fp == NULL) { 
    fprintf(stderr, "Unable to open '%s': %s\n", argv[1], strerror(errno)); 
    return; 
} 

Elf32_Ehdr ehdr; 
if (fread(&ehdr, sizeof(ehdr), 1, fp) != 1) { 
    fprintf(stderr, "fread: %s\n", strerror(errno)); 
    fclose(fp); 
    return; 
} 

if (!elf_check_file(&ehdr)) { 
    fprintf(stderr, "'%s' is not an ELF file\n", argv[1]); 
    fclose(fp); 
    return; 
} 
/* Parse the rest of the ELF file here. */ 

/* Don't forget to close the file. */ 
fclose(fp); 
return; 
関連する問題