Linux libelf破坏ARM-elf二进制文件

Linux libelf破坏ARM-elf二进制文件,linux,arm,elf,abi,Linux,Arm,Elf,Abi,我试图在linux上使用libelf库操作ARM elf二进制文件,但没有成功。即使是一个最小的测试用例也会破坏我的二进制文件,我不知道为什么 下面是我的最小测试代码,它读取elf文件,然后简单地将其写回: #include <stdlib.h> #include <stdio.h> #include <fcntl.h> #include <unistd.h> #include <libelf.h> #include <as

我试图在linux上使用libelf库操作ARM elf二进制文件,但没有成功。即使是一个最小的测试用例也会破坏我的二进制文件,我不知道为什么

下面是我的最小测试代码,它读取elf文件,然后简单地将其写回:

#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h> 
#include <unistd.h>  
#include <libelf.h>
#include <assert.h>

void main (void)
{
    if (elf_version(EV_CURRENT) == EV_NONE)
       return;

    int fd = open ("HelloWorld.elf", O_RDWR);
    assert (fd);

    Elf *e = elf_begin(fd, ELF_C_RDWR, (Elf *) 0);
    assert (e);

    if (elf_update(e, ELF_C_WRITE) == -1)
        return;

    elf_end (e);
    close (fd);

    printf ("ok\n");
    return;
}
运行我的代码后,它会变成:

 Section to Segment mapping:
  Segment Sections...
   00     
   01     .ARM.exidx .heap .stack_dummy .ARM.attributes .comment .svc_table 
   02     .bss 
如果我使用objcopy将修改后的elf二进制文件转换为flash图像,我只会得到垃圾

那么,我应该做些什么来让libelf库与arm二进制文件一起工作呢

背景:

我正在编写一个小实用程序来计算一些校验和并将它们插入elf二进制文件。这需要我的微控制器,不幸的是GNULD不能自己完成。我认为使用高级ELF操纵库将是实现此功能的最佳和最可靠的方法。

我自己发现了它

打开elf文件后,调用:

elf_flagelf (e, ELF_C_SET, ELF_F_LAYOUT);
将告诉libelf不要触摸段和段布局。这可以防止libelf重写可执行文件,我们将得到一个未修改的文件exepced

对节数据进行任何修改后,需要调用elf_flagdata,如下所示:

 Section to Segment mapping:
  Segment Sections...
   00     .ARM.exidx 
   01     .text .ARM.exidx 
   02     .data .bss 
 Elf_Data *data = elf_getdata ( ...

 // do modification to data here..

 elf_flagdata (data, ELF_C_SET, ELF_F_DIRTY);

需要让libelf知道数据已更改,并且必须重新计算elf校验和。

我自己也发现了这一点。。。但我不明白的是为什么必须指定ELF_F_布局标志,我想知道ELF_flagelf(ELF,ELF_C_SET,ELF_DIRTY)是否会让所有东西都重新计算自己。