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
但這給出了,我期待一個地址(需要再定位)的所有地方爲零。
你將永遠有*地址*和binutils的問題。你可以嘗試一個*偏移*。例如在'info'結構體中,使用'((int)(&info - &sym_001))'使事情靜態化。或者使用類似* protocol buffers *的東西。序列化有很多*警告*,並且他們已經被其他人想到了。 Endianess,緊湊表示,路線等 –
@artlessnoise是的,有一些序列化問題。這些應該用目標文件中的重定位數據來解決。但問題是如何訪問目標文件來讀取.rodata和.reloc部分。 – harper
您是否考慮過在C級別工作,可能是通過自定義處理它的GCC編譯器(例如使用[MELT](http://gcc-melt.org/)...)? –