给定以下简单代码段:

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
...

07-24 09:44