我想操縱ARM上的精靈二進制文件在Linux上使用libelf庫沒有成功。即使是最小的測試用例也會破壞我的二進制文件,我不知道爲什麼。libelf腐敗的ARM精靈的二進制文件
這是我最小的測試代碼讀取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可執行的代碼我有點 - 精靈文件的完全副本。這就是我的預期。
但是,如果我傳入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把修改後的小精靈二進制轉換成閃光的形象我只得到垃圾出。
那麼有什麼我應該做的,使libelf圖書館工作與臂二進制文件?
背景:
我正在寫一個小程序來計算一些校驗,並把它們插入到小精靈二進制文件。這是我的微控制器所需要的,不幸的是,LD不能自己做。我認爲使用高級別的ELF操作庫是實現這一功能的最佳和最可靠的方法。
我剛剛發現我自己以及...但我不明白的是爲什麼ELF_F_LAYOUT標誌必須指定,我不知道是否elf_flagelf(小精靈,ELF_C_SET,ELF_F_DIRTY)會使一切重新計算自己。 –