C语言中的弱符号与强符号介绍
弱符号(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语言中的弱符号与强符号介绍相关推荐
- GCC中的弱符号与强符号
转载自 https://www.cnblogs.com/kernel_hcy/archive/2010/01/27/1657411.html 我们经常在编程中碰到一种情况叫符号重复定义.多个目标文件中 ...
- 详解 C 语言中的弱符号与弱引用
C语言中的__attribute__((weak)) 与 attribute ((weakref()) 引言:最近在看 linux 中一些驱动代码.驱动代码中为了实现程序的扩展性和兼容性用了很多 C ...
- JavaScript中的弱引用和强引用
JavaScript中的弱引用和强引用 什么是弱引用和强引用 举例说明弱引用和强引用 在JavaScript中演示弱引用和强引用 弱引用的特性总结 什么是弱引用和强引用 JavaScript 中强引用 ...
- c语言中数组名a和a详细介绍
其实这两个东西挺难理解的,应该也没有那么重要,了解一下好了,主要还是要多多理解数组指针的运算 最近又把学习c语言提上日程上来了~~~先把我打算看的书都写下来吧,<C语言深度剖析>,< ...
- 【Go学习笔记2】go语言中的基本数据类型和包的介绍(一)
数据类型 go语言的数据类型非常丰富,包括int,string,boolean,byte,array,切片,映射等数据类型.当然用户还可以自定义数据类型. 各种数据类型的默认值 从这里我们总结一下go ...
- python 和C语言 中的一些容易混淆的符号整理
Python运算符 主要分为: Arithmetic Operators数学 Comparison (Relational) Operators关系比较 Assignment Operators 赋值 ...
- C语言中的强符号与弱符号
注意,强符号和弱符号都是针对定义来说的,不是针对符号的引用. 一.概述 在C语言中,函数和初始化的全局变量(包括显示初始化为0)是强符号,未初始化的全局变量是弱符号. 对于它们,下列三条规则使用: ① ...
- c语言弱符号与函数指针,浅谈C语言中的强符号、弱符号、强引用和弱引用【转】...
首先我表示很悲剧,在看<程序员的自我修养--链接.装载与库>之前我竟不知道C有强符号.弱符号.强引用和弱引用.在看到3.5.5节弱符号和强符号时,我感觉有些困惑,所以写下此篇,希望能和同样 ...
- C语言中的强符号与弱符号(关于变量声明与定义的深入讨论)
看到一篇介绍C语言强符号与弱符号的文章非常好,转载过来加深印象. 原文地址:http://blog.csdn.net/astrotycoon/article/details/8008629 ===== ...
最新文章
- java 导出文件,导出多个文件方案~
- 基于TensorFlow 2.0的中文深度学习开源书来了!GitHub趋势日榜第一,斩获2K+星
- python写一个系统-使用Python写一个量化股票提醒系统
- 运营商何时推出无限流量?
- 大数据在各个行业中的应用_三维设计广泛应用各个行业
- mysql表设计很多非常大的varchar_聊一聊数据库(MySQL)设计中的数据类型优化
- 使用VS 2019,.NET Core 3和Web API创建ASP.NET Core Blazor CRUD应用程序
- 过滤器为JSP文件生成静态页面
- 纪念王盘声逝世一周年王派演唱会成功举行
- Qt Http实现网络文件下载
- ipad+mysql+客户端_MySQL QueryDB Client
- 华中科技大学伍冬睿教授团队:生理计算中的对抗攻击与防御综述
- 机械制图国家标准的绘图模板_JS制图:映射
- SQLServer数据库文件压缩
- 小马过河(计算几何)
- 猫哥教你写爬虫 022--类与对象(下)
- leetcode 85. Maximal Rectangle(最大矩形)
- python中筛选内容_Python中数据筛选代码实现
- 有理数域上lamada矩阵(方阵)化标准形的实现
- 数据中心解决方案之灾备方案设计(下)