共享库中未定义的外部符号

时间:2011-09-21 16:26:51

标签: c ios linker undefined-symbol nm

我最近在iOS SDK4.3的nm -m -p -g库上运行了System.B.dylib,并且很惊讶地发现很多符号标记为(undefined) (external)。为什么以及何时将未定义的符号标记为外部?我可以理解标记为lazyweak的未定义外部符号,但这些不是。许多pthread_xxx函数属于此类别。但是,当我链接到此库时,所有符号都会被解析。 pthread_xxx符号在\usr\lib\system文件夹中的一个库中定义,因此我假设他们对此感到满意。在链接过程中如何工作?

2 个答案:

答案 0 :(得分:2)

我已经有一段时间了,因为我是nmld C编码忍者,但我认为这只意味着还有其他图书馆链接的图书馆。

答案 1 :(得分:0)

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

HTH