从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
获取char指针,实际的链接文本可以很好地工作。读取大小总是以有趣的,与平台相关的方式中断:在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
很好奇。)
答案 0 :(得分:0)
符号的值是其地址,因此&symbol_name
应该对其进行检索。
example.c
#include <stdio.h>
extern char abs_sym;
int main() { printf("%p\n", (void*)&abs_sym); }
运行示例:
$ gcc ldabs.c -no-pie -Wl,--defsym=abs_sym=0xab && ./a.out
0xab