printf 在哪里定义的?

Where is printf defined?

我编译了一个简单的 c 程序,它在二进制文件上使用 printf 和 运行 otool -l。其中 /usr/lib/libSystem.B.dylibLC_LOAD_DYLIB 命令中被提及。但是当我 nm -a /usr/lib/libSystem.B.dylib 列出该库中的符号时,我找不到 printf。那它是在哪里定义的呢?

首先,otool -L 是查看 executable 链接到的库列表的更简单方法。

其次,如果您将 otool -L 应用于 libSystem.B.dylib,您会发现它又依赖于 /usr/lib/system 中的一堆库。其中之一是 libsystem_c.dylib,它是 C 库。定义 printf.

返回到 libSystem.B.dylib 的 otool -l 输出,您会看到这些依赖项是通过 LC_REEXPORT_DYLIB 加载命令实现的。这就是其他库中的符号在没有实际符号 table 条目的情况下导出的方式。

我想,可以说,这是 nm 中的一个错误,它不显示重新导出的符号。