【发布时间】:2014-05-27 05:57:09
【问题描述】:
在我们的构建系统中,我们生成多个 .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 链接。但是有没有更好的方法来做到这一点?
【问题讨论】:
-
要么全存档,要么制作所有全局数据
static,这样每个使用它的人都会拥有唯一的数据集。 -
当您将
.a静态链接到您的.sos 时,这种令人惊讶的行为是什么?为什么很难调试? -
@HAL .a 中定义的两个全局数据副本,具有相同的符号,会改变程序的行为并混淆调试器。
-
@keltar -Wl,-whole-archive 的便携性如何?如何断言所有全局数据都是静态的,以后不会误引入?
-
@FamZheng 整个存档的行为是明确定义的,但我不确定每个可能的链接器都支持这一点。最好将此库直接集成到程序源中,但如果使用
-fvisibility=hidden编译可能会引发问题。