__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(返回值视具体情况而定)
相当于增加了一个默认函数。
原理:连接器发现同时存在弱符号和强符号,有限选择强符号,如果发现不存在强符号,只存在弱符号,则选择弱符号。如果都不存在:静态链接,恭喜,编译时报错,动态链接:对不起,系统无法启动。
TIPS
weak属性只会在静态库(.o .a )中生效,动态库(.so .ko(内核模块))中不会生效。
举个例子:
strong.c //生成libstrong.so
#include <stdio.h>void real_func()
{printf("int real func\n");
}
weak.c //生成libweak.so
#include <stdio.h>
void real_func() __attribute__((weak));void real_func()
{printf("fake func\n");
}
main.c //
#include <stdio.h>
extern void real_func();void main()
{real_func();
}
如果
gcc main.c -lstrong -lweak
那么输出结果"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属性,那么任何不符合预期的情况,都是可能出现的。
官方解释:
https://sourceware.org/bugzilla/show_bug.cgi?id=3946
如果你觉得有用,请打赏http://39.98.242.44/
__attribute__((weak))相关推荐
- ARM 之十一__weak 和 __attribute__((weak)) 关键字的使用
今天在使用 Keil (主要是 armcc 编译器)编译代码(华大的 MCU 驱动库hc32f46x_interrupts.h / c)的时候遇到了有 __weak 关键字的函数不起作用的问题,甚 ...
- __attribute__((weak)):弱引用,可以不实现
#include <stdio.h>#define __weak __attribute__((weak)) //变量加上weak时,是弱符号.函数加上weak时,是弱引用,可以不实现. ...
- __weak 和 __attribute__((weak)) 关键字的使用
今天在使用 Keil (主要是 armcc 编译器)编译代码(华大的 MCU 驱动库hc32f46x_interrupts.h / c)的时候遇到了有 __weak 关键字的函数不起作用的问题,甚是奇 ...
- __attribute__((weak))是什么意思
最近在阅读tcmalloc代码时发现使用了很多__attribute__((weak)),上网搜了以下有所了解. 弱符号: 若两个或两个以上全局符号(函数或变量名)名字一样,而其中之一声明为weak ...
- __attribute__((weak)) 用法
我们不确定外部模块是否提供一个函数func,但是我们不得不用这个函数. 一.问题声明 extern int func(void); //声明函数,告诉编译器不要管 .................. ...
- __attribute__((weak))介绍以及用法
什么是强符号和弱符号? 在c语言中,函数和初始化的全局变量是强符号,未初始化的全局变量是弱符号.强符号和弱符号的定义是连接器用来处理多重定义符号的,它的规则是:不允许多个强符号:如果一个强符号和一个弱 ...
- C语言:__attribute__((weak)) 弱符号与__attribute__ ((weakref())弱引用
C语言中的__attribute__((weak)) 与 __attribute__((weakref()) 引言:最近在看 linux 中一些驱动代码.驱动代码中为了实现程序的扩展性和兼容性用了很多 ...
- __attribute__ 之weak,alias属性
Weak Alias 跟 Weak Reference 完全没有任何关系,不过是我在看到 Weak Reference 的时候想到的而已. Weak Alias 是 gcc 扩展里的东西,实际上是函数 ...
- GNU C之__attribute__
__attribute__可以设置函数属性(Function Attribute).变量属性(Variable Attribute)和类型属性(Type Attribute) __attribute_ ...
最新文章
- 正则提取编码解码问题
- 后端技术:Hibernate 和 MyBatis 哪个更好用?
- JAVA——实现json bean实体类的传参校验模板及注解详解
- HDU1285 确定比赛名次【拓扑排序】
- boost正则表达式库简单介绍
- Arturia SQ80 V for Mac 音频波形合成器
- 异数OS国产CPU平台移植项目需求分析
- LM2586S 应用笔记
- Python实时获取steam游戏数据
- 如何快速建搭建企业官方网站
- 家具生产设备_家具生产线
- xtu oj Patchouli的金字塔
- python能做什么-你都用 Python 来做什么?
- 正在连接 raw.githubusercontent.com (raw.githubusercontent.com)|::|:443... 失败:拒绝连接。
- 如何获取UnrealEngine虚幻引擎的WebUI插件
- 【C语言】字符指针数组查找字符串
- 一篇文章看懂select_poll_epoll
- c++malloc用法
- 让人费解的统计(股票、幸福指数等)
- excel日期由数字转为 年-月-日