我编译了一个简单的c程序,它使用printf
并在二进制上运行otool -l
。其中/usr/lib/libSystem.B.dylib
在LC_LOAD_DYLIB
命令中提到。但是当我nm -a /usr/lib/libSystem.B.dylib
列出该库中的符号时,我找不到printf
.那么它在哪里定义呢?
首先,otool -L
是查看可执行文件链接到的库列表的更简单方法。
其次,如果你将otool -L
应用于libSystem.B.dylib,你会看到它反过来依赖于/usr/lib/system中的一堆库。其中之一是libsystem_c.dylib,它是C库。这定义了printf
.
回到libSystem.B.dylibotool -l
输出,你会看到这些依赖项是通过LC_REEXPORT_DYLIB
加载命令实现的。这就是导出其他库中的符号的方式,而无需为其提供实际的符号表条目。
我想,可以说,这是一个错误,nm
它不显示重新导出的符号。