美文网首页
weak symbol解决库函数不被link的问题同时记录gcc

weak symbol解决库函数不被link的问题同时记录gcc

作者: 612F | 来源:发表于2018-07-24 20:31 被阅读0次

用weak symbol已经比较长时间,这个功能对于c语言来说其实相当好用。不过最近遇到一个问题,如果一个静态库.o里的函数只有相对于weak的strong函数能被其他.o call到,那这个.o就不会被link到,最终始终会call到weak的那个function。

多次试验和搜索,应该就是静态库的函数只有在要被用到的时候,才会被link,但weak symbol相对比较特殊,会先link到weak的function,然后再去找strong的function。因此strong的function实现在静态库里面,并且对应.o里函数也没被其他.o call 到,整个静态库都不会被link进去,因此最后只会选weak function。

应对的方式

A:利用—whole-archive和—no-whole-archive强制静态库被link进去,这样strong函数一定会被收到。缺点是如果lib之间有同名function会打出build error

B:和A类似,利用link选项-u强制某个function被link,但lib和function较多时不好用

最后附上相关一些ld option及简单说明:

—start-group —end-group》resolve circular dependency,处理gcc .o之间有依赖关系时,因为link顺序引起build error

—whole-archive —no-whole-archive》在这两个option之间,会把静态库的symbol提前link进来,平常只有被call到在会link进去

link时的-u symbol_name强制keep该symbol

相关文章

网友评论

      本文标题:weak symbol解决库函数不被link的问题同时记录gcc

      本文链接:https://www.haomeiwen.com/subject/kugymftx.html