weak symbol
我们用nm看动态库时,会发现有些符号类型是"V",手册里解释如下:
"V" The symbol is a weak object.  When a weak defined symbol is linked with a normal  defined  symbol, the normal defined symbol is used with no error. When a weak undefined symbol is linked and the symbol is not defined, the value of the weak symbol becomes zero with no error.
说的是动态库中的weak symbol,缺省会被normal symbol替代,如果没有定义,则该symbol的值为0。
很抽象,是不是,我一直想找一个简单的例子。
             
最近看过一篇文章:
http://www.cs.virginia.edu/~wh5a/blog/2006/07/20/the-weak-attribute-of-gcc/
终于对所谓的weak symbol有了一点了解。
http://gcc.gnu.org/onlinedocs/gcc-4.1.1/gcc/Function-Attributes.html
讲了__attribute__的语法。
【weak.c】
extern void foo() __attribute__((weak));
int main() {
  if (foo) foo();
}
程序居然能够编译通过,甚至成功执行!让我们来看看是为什么?
首先声明了一个符号foo(),属性为weak,但并不定义它,这样,链接器会将此未定义的weak symbol赋值为0,也就是说foo()并没有真正被调用,试试看,去掉if条件,肯定core dump!
【strong.c】
extern void foo() ;
int main() {
  if (foo) foo();
}
这个是一般程序,编译过不了:
strong.c: undefined reference to `foo'
再添上一个定义文件:

【foo.c】
void foo() {
  printf("in foo./n");
}
OK!
用nm检查一下:
linux:~/test/weak # nm weak.o
         w foo
00000000 T main
linux:~/test/weak # nm foo.o
00000000 T foo
         U printf
链接时,前面那个weak symbol会被后面这个代替,如果没有链接foo.o,也没问题,对应符号为0。
这就是weak symbol的意义。
-------------------------------------------------------------------------------------------------------------------------------------------
`V' The symbol is a weak object.  When a weak defined symbol is linked with a normal defined  symbol, the  normal defined symbol is used with no error.  When a weak undefined symbol is linked and the symbol is not defined, the value of the weak symbol becomes zero with no error.
`W' The symbol is a weak symbol that has not been specifically tagged as a weak object symbol.   When a  weak  defined symbol is linked with a normal defined symbol, the normal defined symbol is used with no error.  When a weak undefined symbol is linked and the symbol is not defined,  the  value of the weak symbol becomes zero with no error.

什么是weak symbol?相关推荐

  1. 关于GCC属性中的弱符号(weak symbol)

    关于弱符号的解释: 若两个或两个以上全局符号(函数或变量名)名字一样,而其中之一声明为weak symbol(弱符号),则这些全局符号不会引发重定义错误.链接器会忽略弱符号,去使用普通的全局符号来解析 ...

  2. C++ inline weak symbol and so on

    关于inline这个关键字,听到强调得最多的是,它只是一种对于编译器的建议,而非强制执行的限定. 但事实上,即使这个优化最终由于函数太过复杂的原因没有达成,加上inline关键字(还有在类定义中直接定 ...

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

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

  4. __attribute__ 之weak,alias属性

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

  5. Keil-MDK 中 [WEAK] 的作用

    转自:http://blog.csdn.net/kissmonx/article/details/21622187 一句话:标记__weak 或 [weak]的函数 就是用在本文件占位的,如果别的文件 ...

  6. C语言之强化,弱化符号weak

    C语言之强化,弱化符号weak 转自:http://blog.csdn.net/astrotycoon/article/details/8008629 一.概述 在C语言中,函数和初始化的全局变量(包 ...

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

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

  8. c语言之函数或者变量的weak属性 C语言之强化,弱化符号weak

    __weak是一个宏,和__packed是同一种东西都是gcc的扩展属性: #define __packed __attribute__((packed)) #define __weak __attr ...

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

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

最新文章

  1. android wifi动画显示,android动态配置Wifi信息
  2. A5D2应用程序无法启动问题
  3. Guojiz网址导航系统PHP网站源码
  4. Linex第三章第四章
  5. python 面向对象 类的内置方法
  6. ubuntu安装 Samba实现局域网文件共享 win10访问
  7. mysql 嵌套_MySQL嵌套查询实例详解
  8. 跨时钟域问题(三)异步FIFO的Verilog实现(格雷码)
  9. py3 写的基于GUI 的 旁注 wwwscan集成扫描工具
  10. 高级前端工程师知识图谱
  11. 关于传奇自动触发的几个常用脚本OnKillMob、StdModeFunc、等触发事件
  12. 清华姚班和100个“张小龙”| 中国AI天才养成计划
  13. 使用UMI仿今日头条首页
  14. 消息传递,生产者消费者
  15. 计算机中文核心期刊-概述一二
  16. Vue mounted方法中使用data变量
  17. javaweb技术及应用QST
  18. Day02:Linux进阶(二)
  19. 用java获取一维数组的平均值_java中一维数组常见运算
  20. 指针在c语言中的概念,c语言中指针概念

热门文章

  1. 【原创】ES5高效封装WIN10系统教程2020系列(三)母盘安装及系统调整
  2. 远程在线打印图文详解AO打印(端桥模式)
  3. Java配置jdbc连接数据库不限制ip设置方法(localhost/127.0.0.1/本机ip地址)
  4. bat命令 获取当前盘符 路径 写环境变量
  5. 玩转数据可视化之R语言ggplot2:(七)对图形添加注释和标签(包含标题、坐标轴、参考线和高亮等注释方法)
  6. 救砖用三星i9300官方4.1.2固件刷机包下载港版和国行版 手机天堂-软件世界 | 手机天堂-软件世界...
  7. IT项目管理最佳实践(管事篇)
  8. vuex mapstate_vuex详解
  9. [Unity3D]Unity3D叙利亚NGUI血液和技能的冷却效果
  10. 拓嘉辰丰:拼多多月卡怎么样?要不要开通?