1

我正在尝试使用 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 SECTION LOCAL DEFAULT 1 2:00000000 0 NOTYPE GLOBAL DEFAULT 1 _binary_baselines_xml_sta 3:00AL0013 NOTYPE默认 1 _binary_baselines_xml_end 4:0000132b 0 NOTYPE 全球默认 ABS _binary_baselines_xml_siz

所以看起来尺寸在那里。我转储了文件并验证了 xml 在偏移量 34 处嵌入为 ascii(由 .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 超出范围”。当我使用该变量时,它是一个非常大的不正确随机数。我尝试了各种其他语法来声明外部变量,例如 char*、char[]、int、int* 等。结果总是一样的。价值就在那里,但我似乎无法得到它。

另一个有趣的地方是,这段代码在 Windows 机器上运行良好,没有在 extern 变量上添加下划线,但其他所有内容都相同。

我似乎在网上找不到太多关于以这种方式使用 objcopy 的信息,因此非常感谢任何帮助。

4

1 回答 1

0

我不确定你的实际问题是什么。*_size 符号是表示大小的绝对符号。您不应该能够实际引用该位置(除非偶然),它只是一种将整数值偷偷带入链接器的方法,而无需实际定义数据变量。你正在做的事情在你如何使用它方面是正确的。

考虑这个问题的最好方法是如果你有以下代码:

char* psize = reinterpret_cast<char*>(0x1234);
int size = reinterpret_cast<int>(psize);

唯一的区别是链接器通过符号为您填充 0x1234 值。

于 2009-12-31T20:34:17.527 回答