c/c++强符号与弱符号
·
定义
编译器默认函数和初始化了的全局变量为强符号,未初始化的全局变量为弱符号,也可以通过GCC "__attribute__((weak))"来定义任何一个强符号变为弱符号。
GCC 中,我们也可以通过使用"__attribute__((weakref))"这个扩展关键字来声明一个对外部函数的引用为弱引用。(__attribute__((weak)))void foo();
链接器链接规则
不允许强符号被多次定义,如果有多个强符号定义,则链接器报符号重定义
如果一个符号在某个目标文件中是强符号,在其他文件中都是弱符号,那么选择强符号
如果一个符号在所有目标都符号,那么选择其中占用空间最大的一个
用途
这种弱符号与弱引用对于库来说十分有用,比如库中定义的弱符号可以被用户定义的强符号所覆盖,从而使得程序可以使用自定义版本的库函数,或者程序可以对某些扩展功能模块的引用定义为弱引用,当我们将扩展模块与程序链接在一起的时,功能模块就可以正常使用。如果我们去掉某些模块,那么程序也可以正常链接,只是缺少了相应的功能,这使得程序的功能更加容易裁剪和组合。
实例


tcmalloc 也是利用强弱符号的规则,可以仅需要链接-ltcmalloc就可以替glibc分配方法
————————————————
版权声明:本文为CSDN博主「June_Hou」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u012385733/article/details/112309640
更多推荐


所有评论(0)