libelf 破坏 ARM elf 二进制文件
libelf corrupts ARM elf binaries
我正在尝试使用 libelf 库在 linux 上操作 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;
}
如果我 运行 将此代码放在 ELF 64 位 x86-64 可执行文件上,我会得到 elf 文件的位精确副本。这正是我所期望的。
但是,如果我传入 ARM 32 位可执行文件,文件就会损坏。它仍然是一个 elf 文件,我可以很好地解析它,但是部分偏移量已被修改并且更糟:段映射部分已损坏:
在 运行 宁我的代码之前映射看起来像这样:
Section to Segment mapping:
Segment Sections...
00 .ARM.exidx
01 .text .ARM.exidx
02 .data .bss
在我的代码 运行 之后,它变成了:
Section to Segment mapping:
Segment Sections...
00
01 .ARM.exidx .heap .stack_dummy .ARM.attributes .comment .svc_table
02 .bss
如果我使用 objcopy 将修改后的 elf 二进制文件转换为闪存图像,我只会得到垃圾。
那么我应该做些什么来使 libelf 库与 arm 二进制文件一起工作?
背景:
我正在编写一个小实用程序来计算一些校验和并将它们插入到 elf 二进制文件中。这需要我的微控制器,不幸的是 gnu LD 不能自己完成。我认为使用高级 ELF 操作库将是实现此功能的最佳和最可靠的方法。
自己找的。
打开 elf 文件后调用:
elf_flagelf (e, ELF_C_SET, ELF_F_LAYOUT);
将告诉 libelf 不要触及段和节布局。这可以防止 libelf 重写可执行文件,我们将得到一个未修改的文件作为 exepcted。
对部分数据进行任何修改后,需要像这样调用 elf_flagdata:
Elf_Data *data = elf_getdata ( ...
// do modification to data here..
elf_flagdata (data, ELF_C_SET, ELF_F_DIRTY);
需要让 libelf 知道数据已更改,需要重新计算 elf 校验和。
我正在尝试使用 libelf 库在 linux 上操作 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;
}
如果我 运行 将此代码放在 ELF 64 位 x86-64 可执行文件上,我会得到 elf 文件的位精确副本。这正是我所期望的。
但是,如果我传入 ARM 32 位可执行文件,文件就会损坏。它仍然是一个 elf 文件,我可以很好地解析它,但是部分偏移量已被修改并且更糟:段映射部分已损坏:
在 运行 宁我的代码之前映射看起来像这样:
Section to Segment mapping:
Segment Sections...
00 .ARM.exidx
01 .text .ARM.exidx
02 .data .bss
在我的代码 运行 之后,它变成了:
Section to Segment mapping:
Segment Sections...
00
01 .ARM.exidx .heap .stack_dummy .ARM.attributes .comment .svc_table
02 .bss
如果我使用 objcopy 将修改后的 elf 二进制文件转换为闪存图像,我只会得到垃圾。
那么我应该做些什么来使 libelf 库与 arm 二进制文件一起工作?
背景:
我正在编写一个小实用程序来计算一些校验和并将它们插入到 elf 二进制文件中。这需要我的微控制器,不幸的是 gnu LD 不能自己完成。我认为使用高级 ELF 操作库将是实现此功能的最佳和最可靠的方法。
自己找的。
打开 elf 文件后调用:
elf_flagelf (e, ELF_C_SET, ELF_F_LAYOUT);
将告诉 libelf 不要触及段和节布局。这可以防止 libelf 重写可执行文件,我们将得到一个未修改的文件作为 exepcted。
对部分数据进行任何修改后,需要像这样调用 elf_flagdata:
Elf_Data *data = elf_getdata ( ...
// do modification to data here..
elf_flagdata (data, ELF_C_SET, ELF_F_DIRTY);
需要让 libelf 知道数据已更改,需要重新计算 elf 校验和。