2016-03-11 61 views
0

我想操縱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操作庫是實現這一功能的最佳和最可靠的方法。

回答

1

自己找到了。

打開ELF文件的調用之後:

elf_flagelf (e, ELF_C_SET, ELF_F_LAYOUT); 

將告訴了libelf不碰段和段佈局。這可以防止libelf重寫可執行文件,我們會得到一個未修改的文件。

任何修改到elf_flagdata通話需要這樣的部分數據後:

Elf_Data *data = elf_getdata (... 

// do modification to data here.. 

elf_flagdata (data, ELF_C_SET, ELF_F_DIRTY); 

需要讓了libelf知道數據已經改變,而且精靈校驗,必須重新計算。

+0

我剛剛發現我自己以及...但我不明白的是爲什麼ELF_F_LAYOUT標誌必須指定,我不知道是否elf_flagelf(小精靈,ELF_C_SET,ELF_F_DI​​RTY)會使一切重新計算自己。 –