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

用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

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容