Gcc 访问GNU对象文件

Gcc 访问GNU对象文件,gcc,arm,Gcc,Arm,我有一个带有一些结构的C文件。目前,我可以使用一个公共符号pub访问结构 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

我有一个带有一些结构的C文件。目前,我可以使用一个公共符号
pub
访问结构

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

但对于我期望地址(需要搬迁)的所有地方,这都是零。

朴实的噪音评论给出了正确的提示。该库完全支持访问对象文件。

地址和BINUTIL总是有问题。你可以试试偏移量。例如,在
info
结构中,使用
((int)(&info-&sym_001))
并使事物保持静态。或者使用协议缓冲区之类的东西。序列化有很多警告,其他人已经考虑过了。Endianess、紧凑表示、对齐等@artlessnoise是的,存在一些序列化问题。这些问题应该通过对象文件中的重新定位数据来解决。但是问题是如何访问对象文件来读取.RoDATA和.ReLoc部分。您是否考虑过在C级工作,也许是通过定制GCC编译器来处理它(例如……)吗?抱歉,从这个问题我还不清楚。请参阅,以及gold和Gnu ld来源。正如Basile所建议的,您可以像使用GCC插件一样使用。@artlessnoise如果这是一个答案,我将接受您的评论。