情况是这样的,碰到一个棘手的问题:我们不确定外部模块是否提供一个函数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))相关推荐

  1. ARM 之十一__weak 和 __attribute__((weak)) 关键字的使用

      今天在使用 Keil (主要是 armcc 编译器)编译代码(华大的 MCU 驱动库hc32f46x_interrupts.h / c)的时候遇到了有 __weak 关键字的函数不起作用的问题,甚 ...

  2. __attribute__((weak)):弱引用,可以不实现

    #include <stdio.h>#define __weak __attribute__((weak)) //变量加上weak时,是弱符号.函数加上weak时,是弱引用,可以不实现. ...

  3. __weak 和 __attribute__((weak)) 关键字的使用

    今天在使用 Keil (主要是 armcc 编译器)编译代码(华大的 MCU 驱动库hc32f46x_interrupts.h / c)的时候遇到了有 __weak 关键字的函数不起作用的问题,甚是奇 ...

  4. __attribute__((weak))是什么意思

    最近在阅读tcmalloc代码时发现使用了很多__attribute__((weak)),上网搜了以下有所了解. 弱符号: 若两个或两个以上全局符号(函数或变量名)名字一样,而其中之一声明为weak ...

  5. __attribute__((weak)) 用法

    我们不确定外部模块是否提供一个函数func,但是我们不得不用这个函数. 一.问题声明 extern int func(void); //声明函数,告诉编译器不要管 .................. ...

  6. __attribute__((weak))介绍以及用法

    什么是强符号和弱符号? 在c语言中,函数和初始化的全局变量是强符号,未初始化的全局变量是弱符号.强符号和弱符号的定义是连接器用来处理多重定义符号的,它的规则是:不允许多个强符号:如果一个强符号和一个弱 ...

  7. C语言:__attribute__((weak)) 弱符号与__attribute__ ((weakref())弱引用

    C语言中的__attribute__((weak)) 与 __attribute__((weakref()) 引言:最近在看 linux 中一些驱动代码.驱动代码中为了实现程序的扩展性和兼容性用了很多 ...

  8. __attribute__ 之weak,alias属性

    Weak Alias 跟 Weak Reference 完全没有任何关系,不过是我在看到 Weak Reference 的时候想到的而已. Weak Alias 是 gcc 扩展里的东西,实际上是函数 ...

  9. GNU C之__attribute__

    __attribute__可以设置函数属性(Function Attribute).变量属性(Variable Attribute)和类型属性(Type Attribute) __attribute_ ...

最新文章

  1. 正则提取编码解码问题
  2. 后端技术:Hibernate 和 MyBatis 哪个更好用?
  3. JAVA——实现json bean实体类的传参校验模板及注解详解
  4. HDU1285 确定比赛名次【拓扑排序】
  5. boost正则表达式库简单介绍
  6. Arturia SQ80 V for Mac 音频波形合成器
  7. 异数OS国产CPU平台移植项目需求分析
  8. LM2586S 应用笔记
  9. Python实时获取steam游戏数据
  10. 如何快速建搭建企业官方网站
  11. 家具生产设备_家具生产线
  12. xtu oj Patchouli的金字塔
  13. python能做什么-你都用 Python 来做什么?
  14. 正在连接 raw.githubusercontent.com (raw.githubusercontent.com)|::|:443... 失败:拒绝连接。
  15. 如何获取UnrealEngine虚幻引擎的WebUI插件
  16. 【C语言】字符指针数组查找字符串
  17. 一篇文章看懂select_poll_epoll
  18. c++malloc用法
  19. 让人费解的统计(股票、幸福指数等)
  20. excel日期由数字转为 年-月-日

热门文章

  1. 短链系统设计-用户自定义短链
  2. dedecms 织梦 数据量达到几十万 生成速度很慢
  3. .htaccess基本设置
  4. 当我把ChatGPT拉进群聊里,我的朋友都玩疯了
  5. css3动画实现摩天轮效果
  6. 定制型的OA系统要了解一下吗?
  7. C# .NET winform地图开发GMap离线地图在线地图自建地图服务器
  8. Pose Animator 让矢量图捕捉你的动作,然后动起来。(翻译学习)
  9. mysql索引失效索引创建原则
  10. 用dockers安装mysql