__attribute__((weak)) 博大精深的gcc ------ 关于弱符号的用法
2016-04-11 17:15
330 查看
我们不确定外部模块是否提供一个函数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(返回值视具体情况而定)
相当于增加了一个默认函数。
原理:连接器发现同时存在弱符号和强符号,优先选择强符号,如果发现不存在强符号,只存在弱符号,则选择弱符号。
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(返回值视具体情况而定)
相当于增加了一个默认函数。
原理:连接器发现同时存在弱符号和强符号,优先选择强符号,如果发现不存在强符号,只存在弱符号,则选择弱符号。
相关文章推荐
- 在Windows平台下使用安装GCC(图)
- C#中Property和Attribute的区别实例详解
- linux使用gcc编译c语言共享库步骤
- javascript 对象属性property与元素属性attribute的浏览器支持
- 新手小心:c语言中强符号与弱符号的使用
- JavaScript Table排序 2.0 (更新)
- Attribute/特性心得随笔
- C/C++编译器GCC下的常用编译命令总结
- GCC 编译c程序的方法及过程解析
- JavaScript中property和attribute的区别详细介绍
- JavaScript中的property和attribute介绍
- 浅谈C语言中的强符号、弱符号、强引用和弱引用
- javascript中attribute和property的区别详解
- Glusterfs的编译选项 #pragma GCC poison system popen
- 【笔记】CentOS上源码安装GCC 4.8.2
- 【笔记】CentOS
- Java调用动态链接库
- RHEL 4.7 (64bit) 环境安装 GCC 4.6 测试记录 (更新至gcc-4.6.1)
- GCC 5 即将发布