我正在尝试使用 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 的信息,因此非常感谢任何帮助。