1

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

4

1 回答 1

2

首先,otool -L是查看可执行文件链接到的库列表的更简单方法。

其次,如果你申请otool -LlibSystem.B.dylib,你会发现它又依赖于 /usr/lib/system 中的一堆库。其中之一是 libsystem_c.dylib,它是 C 库。这定义了printf.

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

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

于 2020-02-09T02:50:38.180 回答