从 C 获取 *ABS* 符号的值

  • 本文关键字:符号 ABS 获取 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的字符指针来很好地工作;读取大小以有趣的、依赖于平台的方式不断中断:在 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

最新更新