在macOS上的链接时获取__TEXT部分的大小

时间:2019-11-27 23:50:30

标签: c macos linker darwin mach-o

通过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标头中解析它,但是有一种方法可以使链接器将数据插入为一个常数?

1 个答案:

答案 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 (而不是部分)的大小。