将符号从静态对象复制到共享对象
我有一个库,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.o
和columns.o
目标文件。 您的程序使用列,但不使用鼠标功能。 所以,你的计划包括在所有的符号columns.o
,但没有在符号mouse.o
都包括在内。
使用“共享对象”( .so
),它是一个单独的对象,因此链接它将包含对象中所有符号,不管是否需要。 在上面的例子,如果我们链接的是libdialog.so
,则程序将包括来自所述符号columns.o
和mouse.o
即使不使用鼠标基于代码。
生成共享对象( .so
)时,使用存档( .a
)时适用相同的链接规则。 因此.so
文件将只包含档案中使用的.o
文件中的符号。