如何打开文件并将信息复制到另一个文件中。我只需要复制幻数和版本。 void read_header(FILE * file,File * file2);
答案 0 :(得分:2)
根据平台的不同,可能会提供已定义此结构的头文件。例如,如果您正在运行linux,则可以尝试包含elf.h
:
#include <elf.h>
#include <stdio.h>
void read_elf_header(const char* elfFile) {
// switch to Elf32_Ehdr for x86 architecture.
Elf64_Ehdr header;
FILE* file = fopen(elfFile, "rb");
if(file) {
// read the header
fread(&header, 1, sizeof(header), file);
// check so its really an elf file
if (memcmp(header.e_ident, ELFMAG, SELFMAG) == 0) {
// this is a valid elf file
}
// finally close the file
fclose(file);
}
}
如果您的系统尚未包含elf.h
,则可以检查elf标头的结构here.
然后你可以创建一个结构来保存你的数据,并简单地读取它:
typedef struct {
uint8 e_ident[16]; /* Magic number and other info */
uint16 e_type; /* Object file type */
uint16 e_machine; /* Architecture */
uint32 e_version; /* Object file version */
uint64 e_entry; /* Entry point virtual address */
uint64 e_phoff; /* Program header table file offset */
uint64 e_shoff; /* Section header table file offset */
uint32 e_flags; /* Processor-specific flags */
uint16 e_ehsize; /* ELF header size in bytes */
uint16 e_phentsize; /* Program header table entry size */
uint16 e_phnum; /* Program header table entry count */
uint16 e_shentsize; /* Section header table entry size */
uint16 e_shnum; /* Section header table entry count */
uint16 e_shstrndx; /* Section header string table index */
} Elf64Hdr;
void read_elf_header(const char* elfFile, const char* outputFile) {
struct Elf64Hdr header;
FILE* file = fopen(elfFile, "rb");
if(file) {
// read the header
fread(&header, 1, sizeof(header), file);
// check so its really an elf file
if(header.e_type == 0x7f &&
header.e_ident[1] == 'E' &&
header.e_ident[2] == 'L' &&
header.e_ident[3] == 'F') {
// write the header to the output file
FILE* fout = fopen(outputFile, "wb");
if(fout) {
fwrite(&header, 1, sizeof(header), fout);
fclose(fout);
}
}
// finally close the file
fclose(file);
}
}
答案 1 :(得分:2)
答案 2 :(得分:0)
使用fopen()
FILE *fp = fopen("youe_elf.bin","rb");
现在使用fread()
从文件中读取数据块。并使用format of ELF file进行映射并获取标头字节,然后使用fopen()
答案 3 :(得分:0)
如果您想要裸机解析,请遵循Cyclone的命题,或者,例如看看其他人这样做,比如http://code.qt.io/cgit/qt/qtbase.git/tree/src/corelib/plugin/qelfparser_p.cpp中的Qt。
然而,有一些库具有更高级别的API。以https://wiki.freebsd.org/LibElf为出发点。