gpt4 book ai didi

C中读取elf文件的正确方法

转载 作者:太空宇宙 更新时间:2023-11-04 10:38:29 26 4
gpt4 key购买 nike

我正在尝试遵循本指南:http://wiki.osdev.org/ELF_Tutorial处理 elf 文件

但是,函数 bool elf_check_fil 指出,给定文件不是正确的 elf(尽管 readelf 表明它是)

代码:

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 我检查了 hdr->e_ident[EI_MAG0]...hdr->e_ident[EI_MAG3] 实际上没有包含正确的魔数(Magic Number)。为什么?

最佳答案

如多条评论所述,您没有正确使用 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;

关于C中读取elf文件的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36246606/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com