【问题标题】:Compiling All the Symbols of an Object File as Weak将目标文件的所有符号编译为弱
【发布时间】:2011-10-26 11:23:48
【问题描述】:

动机

我有 2 个静态库,libStatic1.alibStatic2.a。此外,我有许多使用 libStatic1.a 编译的 SO(共享对象)。 到目前为止,libStatic1.a 和 libStatic2.a 是独立的,一切正常。但是现在我在生成 libStatic1.a 的代码中添加了对生成 libStatic2.a 的代码的依赖。因此,任何依赖于 libStatic1.a 的 SO 现在都需要使用 libStatic2.a 进行编译。这是不可取的,因为它会将对 libStatic2.a 的依赖添加到依赖于 libStatic1.a 的每个构建目标中。

现在只有在 libStatic1.a 上需要使用 libStatic2.a 编译他们的代码才能使编译/运行时成功/不崩溃。这会造成不必要的耦合,我想避免它。

因此,我需要以某种方式将 libStatic2.a 的目标代码“嵌入”到 libStatic1.a 中。如果我只是用 libStatic2.a 的所有目标文件(除了它自己的)编译 libStatic1.a,它基本上会包含它,但这会产生另一个问题——如果 libStatic1.a 的某些用户决定使用 libStatic2.a并将其链接起来,他会得到一个奇怪的“多重定义”错误。如果我能以某种方式告诉编译器生成带有弱符号的 libStatic2.a 的目标文件(仅用于 libStatic1.a),这将解决问题 - 没有人会得到多个定义,也没有所有许多 SO 的 makefile使用 libStatic1.a 的将需要更改。

我的想法:我知道是possible(使用GCC/g++ extensions to the C language)用关键​​字__attribute__weak 属性如下: void __attribute__((weak)) foo(int j);

有没有办法告诉编译器 (g++) 将整个编译单元编译为“弱”,这意味着在链接时符号表中的所有全局符号都将被视为弱?

或者,有没有办法告诉 链接器 (ld)all 某些目标文件/库的符号视为弱符号?

【问题讨论】:

  • 链接时是否遇到符号冲突?
  • @trojanfoe 和 Maxim Yegorushkin:现在我完成了对原始消息的编辑以解释我的动机。

标签: c++ c gcc compiler-construction linker


【解决方案1】:

如果您的库很小,最简单的方法仍然是通过手动添加 __attribute__((weak)) 来更改声明。

另一种可能性是要求g++ 溢出汇编代码(使用-S)并让一些(可能是awked)脚本对其进行处理。

您还可以编写 GCC 插件(假设您的 g++ 是 4.6 版本)或 GCC MELT 扩展。

【讨论】:

    【解决方案2】:

    正常编译,然后用--weakenobjcopy目标文件。

    【讨论】:

      【解决方案3】:

      不,似乎没有;是否有这么多的弱外部函数,单独设置它们的属性是不切实际的?

      【讨论】:

        猜你喜欢
        • 2021-01-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-29
        • 2019-02-26
        • 2015-01-16
        相关资源
        最近更新 更多