为什么Leopard会使用$ non_lazy_ptr来破坏一些符号?更重要的是,修复未定义的符号错误的最佳方法是什么,因为符号已经被$ non_lazy_ptr修改了?
来自:开发人员连接 - 间接寻址
间接寻址是代码生成技术的名称,该技术允许从一个文件中定义的符号从另一个文件引用,而不需要引用文件明确知道定义该符号的文件的布局.因此,可以独立于引用文件修改定义文件.间接寻址最大限度地减少了动态链接器必须修改的位置数量,这有助于代码共享并提高性能.
当文件使用在另一个文件中定义的数据时,它会创建符号引用.符号引用标识从中导入符号的文件和引用的符号.有两种类型的符号引用:非惰性和惰性.
加载模块时,动态链接器将解析非绑定符号引用(绑定到它们的定义).非惰性符号引用本质上是符号指针 - 指针大小的数据片段.编译器为数据符号或函数地址生成非语义符号引用.
惰性符号引用在第一次使用时(而不是在加载时)由动态链接器解析.对引用符号的后续调用直接跳转到符号的定义.延迟符号引用由符号指针和符号存根组成,这些代码直接解引用并跳过符号指针.编译器在遇到对另一个文件中定义的函数的调用时会生成惰性符号引用.