从C

时间:2019-07-13 10:00:42

标签: c ld

从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很好奇。)

1 个答案:

答案 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