我最近在iOS SDK4.3的nm -m -p -g
库上运行了System.B.dylib
,并且很惊讶地发现很多符号标记为(undefined) (external)
。为什么以及何时将未定义的符号标记为外部?我可以理解标记为lazy
或weak
的未定义外部符号,但这些不是。许多pthread_xxx
函数属于此类别。但是,当我链接到此库时,所有符号都会被解析。 pthread_xxx
符号在\usr\lib\system
文件夹中的一个库中定义,因此我假设他们对此感到满意。在链接过程中如何工作?
答案 0 :(得分:2)
我已经有一段时间了,因为我是nm
和ld
C编码忍者,但我认为这只意味着还有其他图书馆链接的图书馆。
答案 1 :(得分:0)
通常这就是动态链接的工作原理。如果您是nm的System.B的静态存档,您将不会观察到此行为。它自己的System.B.dylib不会做太多事情;除非你把它作为动态和静态库的集合集的一部分,它使用它的函数。如果你现在尝试编译你的最终二进制文件但是省略了库路径'/ usr / lib / system'那么你的链接器将会犯规并退出并显示错误,告诉你它找不到对pthread_XXX()的引用(使用上面的例子) )。在二进制文件的最终组装过程中,需要确保它知道所使用的每个函数的位置。
HTH