是什么让符号成为惰性或非惰性符号?

What makes a symbol be lazy or non-lazy one?

最近在学习一些关于Mach-O文件的知识。在学习lazy-symbol & non-lazy symbol的时候遇到一个问题:谁来判断一个symbol是lazy还是non-lazy?为什么?

我想这可能是编译器做的...

更新: 我找到了我的问题的答案,也许是真的:

延迟绑定由链接器的 -z 选项控制,ld。此选项将关键字作为参数;关键字包括(除其他外):

lazy 生成可执行文件或共享库时,将其标记为告诉动态链接器将函数调用解析推迟到调用函数时(惰性绑定),而不是加载时。

now 生成可执行文件或共享库时,将其标记为告诉动态链接器在程序启动时解析所有符号,或者在使用 dlopen() 链接共享库时解析所有符号,而不是将函数调用解析推迟到该点首次调用函数时。

延迟绑定是默认设置。如果您使用 qcc(如我们所建议的),请使用 -W 选项将 -z 选项传递给 ld。例如,指定 -Wl-zlazy-Wl-znow.

参考:Optimizing the runtime linker

相关问题:Clang/GCC真的支持延迟加载功能吗?

听起来你已经理解了的内容。

至于为什么部分:

尽可能晚地做事:(a) 减少启动所需的工作,(b) 如果从未采用该执行路径,则完全避免该工作。这不仅适用于链接器,而且适用于您可以延迟到需要时才执行的任何执行。