c-覆盖静态库中的弱符号



我想从多个来源为我的项目创建一个static.a库,其中一些定义了弱函数,另一些实现了它们。举个例子:

lib1.c:

void defaultHandler()
{
    for(;;);
}
void myHandler() __attribute__((weak, alias ("defaultHandler")));

lib2.c:

void myHandler()
{
    /* do my stuff here */
}

然后我想把它们放在一个单独的库中,这样它对最终应用程序来说似乎是透明的

$ ar -r libhandlers.a lib1.o lib2.o

但是现在在库处理程序中有两个符号myHandler

$ nm libhandlers.a | grep "myHandler"
00000001 W myHandler
00000581 T myHandler

然后,当使用lib时,弱引用将被链接。目前我唯一的解决方案是不将lib2.c包含在库中,而是将其作为源添加到应用程序的Makefile中……这并不令人满意,因为我只想提供几个库来使用,而不是提供一大堆文件。

--whole-archive选项也不令人满意,因为我在嵌入式系统上工作,我不想包含所有我不需要的东西。

有没有一种方法可以编译库,这样如果提供了强符号,弱符号就会消失?

注意:我使用的是arm none eabi gcc v4.8

这是.a库工作方式的副产品——它们只是.o文件的集合。

在编译链接时发生的情况是,对名称的第一个引用被解析为弱引用,而强名称永远不会被查看

你可以自己测试这一点,让两者的名字和强度完全相同,你会看到完全相同的行为。

如果您希望首先解析强引用,请将它们更早地放在归档中,或者创建一个单独的强归档并在链接行中链接第一个。

虽然不直接适用于您的案例,但由于您使用的是嵌入式环境,在创建/使用.so动态库而不是.a归档时,弱引用与强引用会正确生效。当您创建.so时,组成库的所有弱引用都不会生成错误,并且只有其中一个将用于最终产品;如果任何地方都有一个强定义,那么它就会被使用,而不是任何弱定义(只有当您创建.so时,链接单独组成它的所有.o文件,或者如果链接到.a,则在创建.so时使用--whole-archive,这样才能正常工作)。

相关内容

  • 没有找到相关文章

最新更新