通过gold
和其他链接器,可以使链接器使用链接器脚本将.text
节的开始/结尾作为常量写入二进制文件中,例如
PROVIDE_HIDDEN(linker_script_start_of_text = ADDR(.text));
PROVIDE_HIDDEN(linker_script_end_of_text = ADDR(.text) + SIZEOF(.text));
与ld -Tmy_linker_script.lds ...
链接。
我知道可以调用getsectdata或类似的方法来获取有关.text
节的信息,或者从mach-o标头中解析它,但是有一种方法可以使链接器将数据插入为一个常数?
答案 0 :(得分:3)
您可以使用__asm
,使Darwin链接器以一些技巧来插入此数据:
#include <stdio.h>
extern int start_text __asm("section$start$__TEXT$__text");
extern int end_text __asm("section$end$__TEXT$__text");
int main() {
size_t text_section_size_bytes =
(intptr_t)&end_text - (intptr_t)&start_text;
printf("__TEXT.__text section size: 0x%lx\n", text_section_size_bytes);
return 0;
}
在我的机器上,此打印:
$ clang -o test ./test.c
$ ./test
__TEXT.__text section size: 0x43
哪个与objdump
的报告相符:
$ objdump -h ./test
./foo2: file format Mach-O 64-bit x86-64
Sections:
Idx Name Size Address Type
0 __text 00000043 0000000100000f30 TEXT
[...]
您还可以通过使用语法segment$start$__TEXT
/ segment$end$__TEXT
获得相同的 segments (而不是部分)的大小。