将符号从静态对象复制到共享对象

我有一个库,foo,为此我生成了一个静态对象(libfoo.a)。

我有第二个库,为此我创建了一个共享对象(libbar.so),它从libfoo.a中获取一些符号。

我有第三个图书馆,巴兹,我试图链接到酒吧。 在调用链接器时,我会遇到关于条中缺少符号的错误(对应于foo中的符号)。 nm告诉我这些符号存在于libfoo.a中,但不在libbar.so中; 然而,在libbar.so中有一些来自libfoo.a的符号。

为什么不是所有的符号都被复制?


.a库不是一个“静态对象”。 .a文件是一个档案,在理论上与tar类似,但格式不同,并且由ar命令生成。 档案中的每个对象都是不同的和独立的。 通常这些对象都是.o文件,它们是编译的,未链接的对象。 链接( ld )期间,其中一个.o文件中的所有符号都将包含在另一个文件中。 但是,在链接过程中并不需要存档中的所有对象,其他对象文件中的符号将不会在链接文件中看到。

例如,在libdialog.a ,有mouse.ocolumns.o目标文件。 您的程序使用列,但不使用鼠标功能。 所以,你的计划包括在所有的符号columns.o ,但没有在符号mouse.o都包括在内。

使用“共享对象”( .so ),它是一个单独的对象,因此链接它将包含对象中所有符号,不管是否需要。 在上面的例子,如果我们链接的是libdialog.so ,则程序将包括来自所述符号columns.omouse.o即使不使用鼠标基于代码。

生成共享对象( .so )时,使用存档( .a )时适用相同的链接规则。 因此.so文件将只包含档案中使用的.o文件中的符号。

链接地址: http://www.djcxy.com/p/42615.html

上一篇: Copying symbols from static object into shared object

下一篇: dlopen with two shared libraries, exporting symbols