我已经编译了一个简单的 c 程序,它使用printf
并otool -l
在二进制文件上运行。在命令/usr/lib/libSystem.B.dylib
中提到了它。LC_LOAD_DYLIB
但是当我nm -a /usr/lib/libSystem.B.dylib
列出该库中的符号时,我没有找到printf
. 那么它在哪里定义呢?
问问题
202 次
1 回答
2
首先,otool -L
是查看可执行文件链接到的库列表的更简单方法。
其次,如果你申请otool -L
libSystem.B.dylib,你会发现它又依赖于 /usr/lib/system 中的一堆库。其中之一是 libsystem_c.dylib,它是 C 库。这定义了printf
.
回到otool -l
libSystem.B.dylib 的输出,您会看到这些依赖项是通过LC_REEXPORT_DYLIB
load 命令实现的。这就是在没有实际符号表条目的情况下导出其他库中的符号的方式。
我想,可以说,这是一个错误,nm
因为它不显示重新导出的符号。
于 2020-02-09T02:50:38.180 回答