0

我最近在 iOS SDK4.3nm -m -p -gSystem.B.dylib库上运行,惊讶地发现很多符号标记为(undefined) (external). 为什么以及何时将未定义的符号标记为外部?我可以理解标记的未定义外部符号lazyweak但这些不是。许多pthread_xxx功能都属于这一类。但是,当我与此库链接时,所有符号都已解析。这些pthread_xxx符号是在\usr\lib\system文件夹中的一个库中定义的,所以我假设它们从那里得到满足。在链接期间它是如何工作的?

4

2 回答 2

2

自从我成为一名 C 编码忍者以来已经有一段时间了nmld但我认为这仅意味着这个链接还有其他库。

于 2011-09-21T16:46:36.840 回答
0

通常这就是动态链接的工作方式。如果您要对 System.B 的静态存档进行 nm 处理,您将不会观察到这种行为。System.B.dylib 本身不会做太多事情。除非您将其作为一组动态和静态库的一部分,而这些库的功能使用它。如果您现在尝试编译您的最终二进制文件但忽略库路径'/usr/lib/system',那么您的链接器将发出错误并退出并显示错误,告诉您它找不到对 pthread_XXX() 的引用(使用上面的示例)。在二进制文件的最终组装过程中,它需要确保它知道所使用的每个函数的位置。

高温高压

于 2011-09-21T17:28:24.783 回答