将对象文件的所有符号编译为弱

时间:2011-10-26 11:23:49

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

动机

我有2个静态库, libStatic1.a libStatic2.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编译它们的代码,以便编译/运行时成功/不崩溃。这造成了不必要的耦合,我想避免它。

因此,我需要在libStatic1.a中以某种方式“嵌入”libStatic2.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 __ 弱的函数em> 属性如下: void __attribute__((weak)) foo(int j);

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

或者,是否有办法告诉链接器(ld)将某些对象文件/库的符号视为 all ,就好像它们很弱?

3 个答案:

答案 0 :(得分:1)

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

另一种可能性是让g++泄漏汇编代码(使用-S)并在其上运行一些(可能是awked)脚本。< / p>

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

答案 1 :(得分:1)

正常编译,然后使用objcopy --weaken对象文件进行编译。

答案 2 :(得分:0)

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