给定以下简单代码段:
int main (void) {
void* foo = scanf;
void* bar = sscanf;
}
下面是反汇编(取自mach-o可执行文件):
非惰性符号指针的一小部分:
符号表的小部分:
我似乎不理解可执行文件中的第5行和第6行(scanf&sscanf到rax/rcx的movq)。
foo和bar(最终)如何分别拥有scanf和sscanf的地址。
我认为这与映射到进程的动态库(以及最有可能指向那里的非惰性符号指针)有关,但我不明白如何映射。
谢谢
最佳答案
dyld是动态链接器,负责绑定符号。要查看发生了什么,首先使用-fno-pie
选项编译测试项目,以禁用位置独立的可执行文件。这样,您在MachOView中看到的偏移量在运行时将是相同的。然后启动环境变量设置为DYLD_PRINT_BINDINGS
的可执行文件。结果如下:
$ DYLD_PRINT_BINDINGS=YES ./a.out
dyld: bind: a.out:0x100001010 = libsystem_c.dylib:_scanf, *0x100001010 = 0x7FFF94578017
dyld: bind: a.out:0x100001018 = libsystem_c.dylib:_sscanf, *0x100001018 = 0x7FFF94578707
...