弱符号__attribute__((weak))

更新时间:2023-08-03 11:44:54 阅读: 评论:0

弱符号__attribute__((weak))
弱符号是什么?
弱符号:
若两个或两个以上全局符号(函数或变量名)名字⼀样,⽽其中之⼀声明为weak symbol(弱符号),则这些全局符号不会引发重定义错误。链接器会忽略弱符号,去使⽤普通的全局符号来解析所有对这些符号的引⽤,但当普通的全局符号不可⽤时,链接器会使⽤弱符号。当有函数或变量名可能被⽤户覆盖时,该函数或变量名可以声明为⼀个弱符号。弱符号也称为weak alias(弱别名)。
蜂蜜柚子茶attribute((weak))的作⽤
情况是这样的,碰到⼀个棘⼿的问题:我们不确定外部模块是否提供⼀个函数func,但是我们不得不⽤这个函数,即⾃⼰模块的代码必须⽤到func函数:
extern int func(void);
...................
int a = func();
if( a > .....)
{
..........
}
............
我们不知道func函数是否被定义了;
这会导致2个结果:
1:外部存在这个函数func,并且EXPORT_SYMBOL(func),那么在我⾃⼰的模块使⽤这个函数func,正确。
2:外部其实不存在这个函数,那么我们使⽤func,程序直接崩溃。
所以这个时候,__attribute__((weak))派上了⽤场。
在⾃⼰的模块中定义:
int  __attribute__((weak))  func(......)
一朵向日葵{
return 0;
}
将本模块的func转成弱符号类型,如果遇到强符号类型(即外部模块定义了func),那么我们在本模块执⾏的func将会是外部模块定义的func。
如果外部模块没有定义,那么,将会调⽤这个弱符号,也就是在本地定义的func,直接返回了⼀个1(返回值视具体情况⽽定)
相当于增加了⼀个默认函数。
原理:连接器发现同时存在弱符号和强符号,有限选择强符号,如果发现不存在强符号,只存在弱符号,则选择弱符号。如果都不存在:静态链接,恭喜,编译时报错,动态链接:对不起,系统⽆法启动。
weak属性只会在静态库(.o .a )中⽣效,动态库(.so)中不会⽣效。
强符号和弱符号的例⼦
举个例⼦:
悄无声息的反义词
strong.c //⽣成libstrong.so
#include <stdio.h>
void real_func()
买菜歌{
printf("int real func\n");
}
网格员管理办法weak.c
#include <stdio.h>
void real_func() __attribute__((weak));
合同书
void real_func()
{平淡中也有诗
printf("fake func\n");
}
如果
gcc main.c -lstrong -lweak
那么输出结果"real func"。
main.c
#include <stdio.h>
extern void real_func();
void main()
{
real_func();
}
如果
gcc main.c -lweak -lstrong
那么输出结果为"fake func"。
可见,对于动态库,weak属性毫⽆作⽤,且main中调⽤哪个real_func(),取决于顺序。如果将strong.c 和 weak.c编译成.a或者.o
gcc main.c strong.o weak.o
或者
gcc main.c strong.o weak.o
那么输出结果都是"real func"。
所以,如果在so中使⽤weak属性,那么任何不符合预期的情况,都是可能出现的。
米非司酮片副作用

本文发布于:2023-08-03 11:44:54,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/89/1106519.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:符号   函数   模块   链接   定义   存在   结果
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图