从 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
特别好奇。
符号的值是它的地址,所以&symbol_name
应该检索它。
例子.c
#include <stdio.h>
extern char abs_sym;
int main() { printf("%pn", (void*)&abs_sym); }
运行示例:
$ gcc ldabs.c -no-pie -Wl,--defsym=abs_sym=0xab && ./a.out
0xab