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



动机

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

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

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

我的想法:我知道(使用C语言的GCC/g++扩展(可以用关键字__attribute__weak属性声明一个函数,如下所示:void __attribute__((weak)) foo(int j);

有没有一种方法可以告诉编译器(g++(将整个编译单元编译为"弱",这意味着符号表中的所有全局符号在链接时都将被视为弱?

或者,是否有方法告诉链接器(ld(某些对象文件/库的所有符号视为弱符号

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

另一种可能性可能是要求g++溢出程序集代码(使用-S(,并让一些(可能是awked(脚本处理它

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

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

不,似乎没有;是否存在如此多的弱外部函数,以至于单独设置它们的属性是不可行的?

最新更新