链接到多个对象的自定义.a

时间:2014-05-27 05:57:10

标签: linux linker ld

在我们的构建系统中,我们生成多个.so文件(foo.so,bar.so,...),这些文件在运行时由主可执行文件(biz)加载。所以.so文件是分开链接的。

我们还有自己的util.a静态库,它有一些实用功能和全局数据。

当一些.so想要使用util.a数据/函数时出现问题,但是我们无法将每个.so链接到util.a.这是因为数据部分:全局数据在程序地址空间中必须是唯一的。如果多个.so链接到util.a并且具有数据副本,则程序行为将非常令人惊讶,但难以调试。

我们也无法将可执行文件(biz)链接到util.a.链接器不会将所有内容都放到目标上,因为biz没有代表.so引用这些函数。

当然,除非将util.a与-Wl,-whole-archive相关联。但是有更好的方法吗?

2 个答案:

答案 0 :(得分:2)

解决方案1:考虑将util.a设为动态库util.so。

解决方案2:不要让链接器导出util.a导出的任何符号。使用gcc时,您可以使用__attribute__((visibility("hidden")))

来实现此目的
int __attribute__((visibility("hidden"))) helperfunc(void *p);

您可以使用objdump检查导出的符号。

答案 1 :(得分:0)

要回答自己的问题,最终的解决方案就像:

http://lists.gnu.org/archive/html/qemu-devel/2014-09/msg00099.html

TL; DR:使用nm (1)在.so对象内搜索所有有趣的符号(您希望从档案中提取),然后使用-Wl,-u,$SYMBOL注入编译命令行。请注意,-Wl,-u,$SYMBOL参数需要在命令行中的归档名称之前,因此链接器知道它需要链接它们。