我正在尝试将文件的内容读入结构。结构看起来像这样:
typedef struct{
unsigned char e_ident[EI_NIDENT] ;
Elf32_Half e_type;
Elf32_Half e_machine;
Elf32_Word e_version;
Elf32_Addr e_entry;
Elf32_Off e_phoff;
Elf32_Off e_shoff;
Elf32_Word e_flags;
Elf32_Half e_ehsize;
Elf32_Half e_phentsize;
Elf32_Half e_phnum;
Elf32_Half e_shentsize;
Elf32_Half e_shnum;
Elf32_Half e_shstrndx;
} Elf32_Ehdr;
extern Elf32_Ehdr elfH;
基本上是ELF头文件。因此,无论如何,我想将文件的内容加载到此结构中。
函数看起来像这样。
Elf32_Ehdr elfH;
int load(char* fname){
FILE* file = fopen(fname,"r");
if(NULL == file) return 0;
fread(&elfH, 1, 52, file);
fclose(file);
return 1;
}
似乎无法正常工作。 elfH的内容与预期不符。可能是什么问题?我应该>
我正在尝试将文件的内容读入结构。结构看起来像这样:typedef struct {unsigned char e_ident [EI_NIDENT]; Elf32_Half e_type; ...
这是我用来从ELF可执行文件读取标头的代码。
您必须在"b"
的文件访问模式字符串("rb"
)中添加fopen
才能进行二进制数据读取。您的硬编码elf标头大小也可能不是一个好主意,因为您的elf标头结构的大小可能不完全是62。sizeof(Elf32_Ehdr)
可能是一种更好的方法...
也许您的问题是文件中的数据没有以程序期望的相同的endianness写入。
C对struct
的内容如何在内存中打包和对齐作出有限的保证。 Elf32_Ehdr
结构的元素是否实际上是连续的,这可能与编译器和平台有关。由于它们的大小都不同,所以我对此表示怀疑(如果您打印出sizeof(Elf32_Ehdr)
并将其与标题的实际磁盘大小进行比较,则可能会看到差异)。
正如dragosht指出的,如果您使用某种Windows计算机,则可能需要打开二进制文件。
您拥有的代码向后读取,这会使if语句不正确。如果项已读取,则fread返回数字。如果向后提供size参数,则它将返回读取的字节数。因此,解决方案是给两个size参数以相反的顺序读取。