gpt4 book ai didi

linux - 从多个对象链接到自定义 .a

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:19:49 26 4
gpt4 key购买 nike

在我们的构建系统中,我们生成多个 .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 链接起来。但是有没有更好的方法来做到这一点?

最佳答案

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

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

int __attribute__((visibility("hidden"))) helperfunc(void *p);

您可以使用 objdump 来检查导出了哪些符号。

关于linux - 从多个对象链接到自定义 .a,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23882000/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com