在我们的构建系统中,我们生成多个.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相关联。但是有更好的方法吗?
答案 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
参数需要在命令行中的归档名称之前,因此链接器知道它需要链接它们。