将elf标头写入输出文件

时间:2019-01-08 15:10:16

标签: c elf

我正在尝试在输出文件中写入一个elf标头。

我尝试使用fwrite和fputc,但是当我将结果与readelf -h进行比较时,它没有给出我期望的结果。

我发现也许是,我必须在elf标题可能会改变某些内容之后写节标题,因为我不确定这是否会以任何方式影响-h选项。

char* data2 = malloc(sizeof(char)*sizeof(data));
char* TableHs2 = malloc(sizeof(char)*sizeof(*TableHs));
printf("sizeof(data2) = %ld\n",strlen(data2) );

FILE* resultat=fopen("SortieElf","w+");


memcpy(data2,&data,sizeof(data));
memcpy(TableHs2,TableHs,sizeof(*TableHs));
printf("memcpy succesfull\n");
for(int i=0;i<sizeof(data);i++)
{
    //printf("%c\n",data2[i] );
    fputc(data2[i],resultat);

}

for(int i=0;i<sizeof(TableHs);i++)
{
    //printf("%c\n",data2[i] );
    fputc(TableHs2[i],resultat);

}

//fwrite(&data,1,sizeof(data),resultat);
fclose(resultat);

readelf -h输出中超出“ Version ABI”的所有内容都不正确。

1 个答案:

答案 0 :(得分:1)

问题是由于两件事:

  1. 使用fopen("SortieElf","w+"),您以 text 模式打开文件
  2. 使用fputc(data2[i],resultat)编写一个字符,该字符在文本模式下可能会进行一些翻译(最值得注意的是,与换行符'\n'相对应的字符可以转换为回车-newline "\r\n"(在某些平台上)。

解决方案有两个方面:首先,您需要以 binary 模式打开文件:

fopen("SortieElf","w+b")

第二,使用fwrite而不是(不需要临时缓冲区)写整个结构

fwrite(&data, sizeof data, 1, resultat);

您的代码还存在其他问题,例如在指针上使用sizeof,该指针将返回 pointer 的大小,而不是其指向的数据。