__got段与__nl_symbol_ptr段的区别及后者难定位原因
__DATA_CONST.__got 与 __DATA.__nl_symbol_ptr 的区别及缺失原因
核心共性
二者都标记为S_NON_LAZY_SYMBOL_POINTERS,会在Mach-O加载阶段完成符号绑定,无需等到第一次调用时才解析。
关键区别
定位与用途
__DATA.__nl_symbol_ptr:是Objective-C运行时早期专门用于存放非懒加载类、协议等符号指针的段,属于可写的__DATA段。__DATA_CONST.__got:是更通用的非懒加载符号指针容器,覆盖C/C++全局变量、函数指针,以及现代Objective-C优化后的符号引用,位于只读的__DATA_CONST段,安全性更高。
历史进化与合并
苹果的Clang/LLVM工具链在后续版本中做了优化,将__nl_symbol_ptr的功能合并到了__DATA_CONST.__got中。现在默认编译的项目(无论是C/C++还是Objective-C)都会把非懒加载符号指针统一放到__DATA_CONST.__got,不再单独生成__DATA.__nl_symbol_ptr段——这就是你在多数Mach-O文件中找不到它的核心原因。
何时还能看到__nl_symbol_ptr?
只有在使用非常老旧的编译工具(比如GCC而非Clang),或者通过特定链接器标志强制保留该段的传统项目中,才可能仍然存在__DATA.__nl_symbol_ptr。
内容的提问来源于stack exchange,提问作者Evan
相关产品推荐
相关产品推荐

