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

时间:2012-02-22 01:52:10

标签: gcc linker

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

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

我有第三个图书馆,baz,我正试图链接到吧。在调用链接器时,我得到有关条形中缺少符号的错误(对应于foo中的符号)。 nm告诉我这些符号存在于libfoo.a中,但不存在于libbar.so中;但是,libbar.so中的libfoo.a中有一些符号。

为什么不复制所有符号?

1 个答案:

答案 0 :(得分:5)

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

例如,在libdialog.a中,有mouse.ocolumns.o个目标文件。您的程序使用列,但不使用鼠标功能。因此,您的计划包含columns.o中的所有符号,但mouse.o中没有符号。

使用“共享对象”(.so),它是一个单个对象,因此链接它将包括对象中的所有符号,是否需要。在上面的示例中,如果我们与libdialog.so相关联,那么即使未使用基于鼠标的代码,该程序也会包含来自columns.omouse.o的符号。

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