我正在尝试使用objcopy将xml文件转换为目标文件,然后链接到RHEL5上的另一个共享库并由其使用。我用这个命令转换文件:
objcopy --input-format binary --output-target i386-pc-linux-gnu --binary-architecture i386 baselines.xml baselines.0
创建目标文件并使用readelf我得到以下内容:
符号表'.symtab'包含5个条目: Num:值大小类型绑定Vis Ndx名称 0:00000000 0 NOTYPE LOCAL DEFAULT UND 1:00000000 0部分当地违约1 2:00000000 0 NOTYPE GLOBAL DEFAULT 1 _binary_baselines_xml_sta 3:0000132b 0 NOTYPE GLOBAL DEFAULT 1 _binary_baselines_xml_end 4:0000132b 0 NOTYPE GLOBAL DEFAULT ABS _binary_baselines_xml_siz
所以看起来大小就在那里。我转储了文件,并验证了xml是否作为ascii嵌入到偏移量34(由.data值指定)并且它是正确的。数据大小为0x132b字节,由变量指定。
然后在代码中,我声明了几个变量:
extern "C"
{
extern char _binary_baselines_xml_start;
extern char _binary_baselines_xml_size;
}
static const char* xml_start = &_binary_baselines_xml_start;
const uint32_t xml_size = reinterpret_cast<uint32_t>(&_binary_baselines_xml_size);
当我进入此步骤时,xml指针是正确的,我可以在调试器中看到xml文本。但是,大小符号显示值为0x132b(这是我想要的),但它也表示“地址0x132b超出范围”。当我使用变量时,它是一个非常大的不正确的随机数。我已经尝试了各种其他语法来声明extern变量,例如char *,char [],int,int *等。结果总是相同的。价值在那里,但我似乎无法达到它。
另一个值得关注的问题是,这个代码在Windows机器上工作正常,没有extern变量的前置下划线,但其他所有变量都相同。
我似乎无法在网上找到以这种方式使用objcopy的内容,因此非常感谢任何帮助。
答案 0 :(得分:0)
我不确定你的实际问题是什么。 * _size符号是表示大小的绝对符号。您不应该能够实际引用该位置(除非意外)它只是一种将整数值潜入链接器而不实际定义数据变量的方法。你正在做的是正确的使用方式。
考虑到这一点的最佳方式是,如果您有以下代码:
char* psize = reinterpret_cast<char*>(0x1234); int size = reinterpret_cast<int>(psize);
唯一的区别是链接器通过符号为您填写0x1234值。