弱符号(Weak symbol)是链接器(ld)在生成ELF(Executable and Linkable Format,缩写为ELF,可执行和可链接格式,是一种用于可执行文件、目标文件、共享库和核心转储的标准文件格式。ELF文件有两种索引:程序标头中记载了运行时所需的段,而段首地址表记载了二进制文件中段的首地址。)文件的过程中使用的一种特殊属性符号。默认情况下,如果没有特别声明,目标文件里面的符号都是强符号(Strong symbol)。在链接过程中,一个强符号会优先于一个同名的弱符号。相比之下,两个同名强符号一起链接会出现链接错误即重复定义错误。当链接一个可执行文件,弱符号可以不定义。但对于强符号,如果没有定义,连接器会产生一个“符号未定义”错误 (undefined symbol)。使用弱符号的目的是,当不确定这个符号是否被定义的情况下,链接器也可以成功链接出ELF文件,适用于某些模块还未实现的情况下,其他模块的先行调试。弱符号在C和C++的规范里面没有被提及,所以使用弱符号的代码,移植性不是非常好,这个跟编译器相关。

弱符号通常来源于未初始化的全局变量。而默认情况下,编译器将函数和初始化了全局变量作为强符号 。可以通过GCC的__attribute__((weak))来定义任何一个强符号为弱符号。不同的目标文件中不能有同名的强符号,否则不能链接在一起。如果一个符号在某个目标文件中是强符号,在其它文件中都是弱符号,那么该名称在链接时选择强符号。如果一个符号在所有的目标文件中都是弱符号,则选择占用空间(字节数)最大的一个,如果占用空间相同,则按照链接顺序选择第一个。

以下是测试代码:

main.c:

#include <stdio.h>int __attribute__((weak)) x = 1; // weak symbol
int y = 2; // strong symbol
int z; // weak symbol, COM
extern int a; // neither weak symbol nor strong symbol
extern int __attribute__((weak)) b; // weak symbol
static int c; // neither weak symbol nor strong symbolvoid __attribute__((weak)) fun1()  // weak symbol
{fprintf(stdout, "fun1 Line: %d\n", __LINE__);
}void __attribute__((weak)) fun2(); // weak symbolvoid fun3() // strong symbol
{fprintf(stdout, "fun3 Line: %d\n", __LINE__);
}int main()
{fun1();fun3();if (fun2) {fprintf(stdout, "run fun2\n");fun2();}fprintf(stdout, "x = %d, y = %d, z = %d\n", x, y, z);fprintf(stdout, "c = %d\n", c);return 0;
}

build.sh:

#! /bin/bashif [[ -e build  ]]; thenecho "##### rm build dir"rm -rf build
fimkdir build
cd buildecho -e "\n##### start build and link:"
gcc -c ../main.c
gcc -o main main.oecho -e "\n##### read elf:"
readelf --syms main.oecho -e "\n##### run:"
./main

执行结果如下:$ ./build.sh

GitHub: https://github.com/fengbingchun/Linux_Code_Test

C语言中的弱符号与强符号介绍相关推荐

  1. GCC中的弱符号与强符号

    转载自 https://www.cnblogs.com/kernel_hcy/archive/2010/01/27/1657411.html 我们经常在编程中碰到一种情况叫符号重复定义.多个目标文件中 ...

  2. 详解 C 语言中的弱符号与弱引用

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

  3. JavaScript中的弱引用和强引用

    JavaScript中的弱引用和强引用 什么是弱引用和强引用 举例说明弱引用和强引用 在JavaScript中演示弱引用和强引用 弱引用的特性总结 什么是弱引用和强引用 JavaScript 中强引用 ...

  4. c语言中数组名a和a详细介绍

    其实这两个东西挺难理解的,应该也没有那么重要,了解一下好了,主要还是要多多理解数组指针的运算 最近又把学习c语言提上日程上来了~~~先把我打算看的书都写下来吧,<C语言深度剖析>,< ...

  5. 【Go学习笔记2】go语言中的基本数据类型和包的介绍(一)

    数据类型 go语言的数据类型非常丰富,包括int,string,boolean,byte,array,切片,映射等数据类型.当然用户还可以自定义数据类型. 各种数据类型的默认值 从这里我们总结一下go ...

  6. python 和C语言 中的一些容易混淆的符号整理

    Python运算符 主要分为: Arithmetic Operators数学 Comparison (Relational) Operators关系比较 Assignment Operators 赋值 ...

  7. C语言中的强符号与弱符号

    注意,强符号和弱符号都是针对定义来说的,不是针对符号的引用. 一.概述 在C语言中,函数和初始化的全局变量(包括显示初始化为0)是强符号,未初始化的全局变量是弱符号. 对于它们,下列三条规则使用: ① ...

  8. c语言弱符号与函数指针,浅谈C语言中的强符号、弱符号、强引用和弱引用【转】...

    首先我表示很悲剧,在看<程序员的自我修养--链接.装载与库>之前我竟不知道C有强符号.弱符号.强引用和弱引用.在看到3.5.5节弱符号和强符号时,我感觉有些困惑,所以写下此篇,希望能和同样 ...

  9. C语言中的强符号与弱符号(关于变量声明与定义的深入讨论)

    看到一篇介绍C语言强符号与弱符号的文章非常好,转载过来加深印象. 原文地址:http://blog.csdn.net/astrotycoon/article/details/8008629 ===== ...

最新文章

  1. java 导出文件,导出多个文件方案~
  2. 基于TensorFlow 2.0的中文深度学习开源书来了!GitHub趋势日榜第一,斩获2K+星
  3. python写一个系统-使用Python写一个量化股票提醒系统
  4. 运营商何时推出无限流量?
  5. 大数据在各个行业中的应用_三维设计广泛应用各个行业
  6. mysql表设计很多非常大的varchar_聊一聊数据库(MySQL)设计中的数据类型优化
  7. 使用VS 2019,.NET Core 3和Web API创建ASP.NET Core Blazor CRUD应用程序
  8. 过滤器为JSP文件生成静态页面
  9. 纪念王盘声逝世一周年王派演唱会成功举行
  10. Qt Http实现网络文件下载
  11. ipad+mysql+客户端_MySQL QueryDB Client
  12. 华中科技大学伍冬睿教授团队:生理计算中的对抗攻击与防御综述
  13. 机械制图国家标准的绘图模板_JS制图:映射
  14. SQLServer数据库文件压缩
  15. 小马过河(计算几何)
  16. 猫哥教你写爬虫 022--类与对象(下)
  17. leetcode 85. Maximal Rectangle(最大矩形)
  18. python中筛选内容_Python中数据筛选代码实现
  19. 有理数域上lamada矩阵(方阵)化标准形的实现
  20. 数据中心解决方案之灾备方案设计(下)

热门文章

  1. Mapbox HTML可视化点,线,多线,面带底图
  2. C++:随笔2--I/O实践
  3. 机器学习中的数学基础:(1)实际应用中矩阵特征值与特征向量的几何意义
  4. LabVIEW实现PCB电路板元器件匹配定位(实战篇—7)
  5. Halcon 点云拟合平面并获取单位法向量及位姿
  6. C语言实现AES加解密
  7. DOT:视觉SLAM的动态目标物跟踪
  8. cv_bridge中的编码模式与实现
  9. 喂~讲真~我很讨厌chrome谷歌浏览器的默认填充输入框input样式咧,敲击讨厌滴啦,怎么去掉介个样式尼
  10. 多线程中使用mktime和setenv函数