我需要写函数write_file: 此函数write_file(int fdOut,char * start1,char * start2)接收输出文件的文件描述符和两个指向映射到内存的ELF文件结构的指针。 循环遍历节头表中的所有节头,将相关字段(节名称,偏移量和长度)打印到stdout(用于调试),并将相应的节内容写入输出文件。
我如何“将相应的部分内容写入输出文件”? 它总是复制0个字节...
这就是我写的:void write_file(int fdOut,char * start_a,char * start_b){
char *start1=start_a;
Elf32_Ehdr *header;
Elf32_Shdr *curr;
char *curr_name;
int i;
int c;
write(fdOut , start1 , 52);
start1=start_a;
header = (Elf32_Ehdr *)start1;
for(i=0 ; i< header->e_shnum ; i++){
start1=start_a;
curr= get_shdr_from_index(i, start1); /*returns a pointer to the requested section header**/
curr_name=get_section_name(i, start1); /*returns a pointer into the section header string table.**/
printf("[ %d ] %20s %20x %20x\n", i ,
curr_name , curr->sh_offset , curr->sh_size);
if (c=write(fdOut, curr, curr->sh_size)<0) {
perror("error");
exit(-1);
}
printf("%d" , c);
}
}
答案 0 :(得分:1)
你的第一个错误就在这里:
if (c=write(fdOut, curr, curr->sh_size)<0) { ...
了解运算符优先级here。你打算写什么:
if ((c = write(fdOut, curr, curr->sh_size)) < 0) { ...
您的第二个错误是要求您将部分内容写入fd。但是您正在编写标题部分,而不是内容。内容可在原始文件中找到,偏移量为curr->sh_offset
。该数据可能根本不存在于内存中,因此您可能需要在原始文件中lseek
并read
来自那里的数据,然后才能write
数据到输出。
答案 1 :(得分:0)
使用-O binary
输出格式:
objcopy -O binary --only-section=.text foobar.elf foobar.text