【发布时间】:2019-07-13 10:00:42
【问题描述】:
从 C 中访问 *ABS*(绝对,不可重定位)符号的实际值的正确方法是什么?
我正在使用 ld 将数据(... HTML 模板)嵌入到可执行文件中(... 遵循https://csl.name/post/embedding-binary-data/ 中描述的方法)。如:
ld -r -b binary [the_file_to_be_embedded] -o [some_object.o]
然后,我正在使用
const char _some_object_start;
const char _some_object_end;
const int _some_object_size;
在实际代码中。通过使用&_some_object_start 获取字符指针,实际链接的文本可以很好地工作;读取大小一直以有趣的、依赖于平台的方式中断:在 ARM64 上,(long) &_some_object_size 实际上最终是大小,但在 x64 上,编译器正试图使其与 PC 相关并且最终没有得到正确的结果.
作为参考,实际的符号表如下所示:
SYMBOL TABLE:
00000000 l d .data 00000000 .data
0000000d g .data 00000000 _binary_hello_world_txt_end
0000000d g *ABS* 00000000 _binary_hello_world_txt_size
00000000 g .data 00000000 _binary_hello_world_txt_start
(通过objdump -x获取。)
我假设ld 添加了大小数据,假设与它链接的代码有某种合理的方式可以读取它,因此问题。
(...更多的是理论上的,因为&_obj_end - &obj_start 仍然可以解析为实际数据长度;不过我特别好奇_obj_size。)
【问题讨论】:
-
您可以通过将 end 和 start 的地址转换为 uintptr_t 并取差来获取大小