2013-07-29 69 views
0

我有一個C文件與一些結構。目前我可以使用一個公共符號pub訪問結構。訪問GNU對象文件

char sym_001[] = { 1,2,3,4,5 }; 
char sym_002[] = { 3,4,5 }; 
char sym_003[] = { 0,8,15 }; 
struct _info { int n; char*a } info[] = { 
    { 5, &sym_001 }, 
    { 3, &sym_002 }, 
    { 3, &sym_003 } 
}; 
typedef struct pat { int a,b; struct _info*i; struct _pat*p } pat; 
pat pat1 = { 3, 4, &info[2], 0 }; 
pat pat2 = { 3, 4, &info[0], &pat1 }; 
// 
struct { int property; pat*p } pub = { 1, &pat2 }; 

我需要序列化到一個流並反序列化流返回到內存佈局。一個問題是需要用流中的偏移量以某種方式替換的地址,並使用目標處的新地址進行恢復。但這不是真正的挑戰。

雖然序列化不應該是一個問題我想訪問編譯器輸出本身。我寧願避免鏈接我的序列化程序和目標文件,因爲有很多這樣的數據文件要處理。有沒有一種方便的方式來訪問GNU二進制文件?

我曾嘗試使用objcopy命令:

objcopy -I elf32-littlearm -O binary DS-Digital8.o foo.bin 

但這給出了,我期待一個地址(需要再定位)的所有地方爲零。

+0

你將永遠有*地址*和binutils的問題。你可以嘗試一個*偏移*。例如在'info'結構體中,使用'((int)(&info - &sym_001))'使事情靜態化。或者使用類似* protocol buffers *的東西。序列化有很多*警告*,並且他們已經被其他人想到了。 Endianess,緊湊表示,路線等 –

+0

@artlessnoise是的,有一些序列化問題。這些應該用目標文件中的重定位數據來解決。但問題是如何訪問目標文件來讀取.rodata和.reloc部分。 – harper

+0

您是否考慮過在C級別工作,可能是通過自定義處理它的GCC編譯器(例如使用[MELT](http://gcc-melt.org/)...)? –

回答

0

無用的噪音評論給出正確的提示。 libelf庫完全支持訪問目標文件。