强符号,弱符号

原文引用https://www.dazhuanlan.com/2019/08/26/5d6304ae4bca7/

对于链接器来说,所有的全局符号可分为两种:强符号(Strong symbols),弱符号(Weak symbols)。gcc的attribute中有个attribute((weak)),就是用来声明这个符号是弱符号的。gcc手册中这样写道:

The weak attribute causes the declaration to be emitted as a weak symbol rather than a global. This is primarily useful in defining library functions which can be overridden in user code, though it can also be used with non-function declarations. Weak symbols are supported for ELF targets, and also for a.out targets when using the GNU assembler and linker.
对于这个gcc扩展,这里作了一个简洁的介绍。我们来看更通用的情况。;)

一般来说,函数和已初始化的变量是强符号,而未初始化的变量是弱符号。对于它们,下列三条规则适用:

1. 同名的强符号只能有一个。
2. 有一个强符号和多个同名的弱符号是可以的,但定义会选择强符号的。
3. 有多个弱符号时,链接器可以选择其中任意一个。

这三条规则看起来很好理解,其实不然,尤其是当这些弱符号类型和强符号不同时!表面上看起来正确的进程会导致严重的错误!考虑下面这个csapp中的例子:

===a.c===
int x=7;
int y=5;
p1() {}

===b.c===
double x;
p2() {}

我们把它们一起编译,并且在p2()函数中给x赋值,你会发现,y也改变了! 虽然x被看作是double,但其定义会取a.c中的int x,也就是说,在b.c中会把a.c中的int x当double来用!这当然是错误!之所以会这样,就是因为上面的规则2。避免这种错误的一个方法是,给gcc加上-fno-common选项。

关于弱符号,man手册中这样解释到:

原文地址:https://www.cnblogs.com/petewell/p/11410486.html

时间: 2024-10-18 00:24:28

强符号,弱符号的相关文章

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

注意,强符号和弱符号都是针对定义来说的,不是针对符号的引用. 一.概述 在C语言中,函数和初始化的全局变量(包括显示初始化为0)是强符号,未初始化的全局变量是弱符号. 对于它们,下列三条规则使用: ① 同名的强符号只能有一个,否则编译器报"重复定义"错误. ② 允许一个强符号和多个弱符号,但定义会选择强符号的. ③ 当有多个弱符号相同时,链接器选择占用内存空间最大的那个. 二.哪些符号是弱符号? 我们经常在编程中碰到一种情况叫符号重复定义.多个目标文件中含有相同名字全局符号的定义,那么

嵌入式C语言自我修养 09:链接过程中的强符号和弱符号

9.1 属性声明:weak GNU C 通过 attribute 声明weak属性,可以将一个强符号转换为弱符号. 使用方法如下. void __attribute__((weak)) func(void); int num __attribte__((weak); 编译器在编译源程序时,无论你是变量名.函数名,在它眼里,都是一个符号而已,用来表征一个地址.编译器会将这些符号集中,存放到一个叫符号表的 section 中. 在一个软件工程项目中,可能有多个源文件,由不同工程师开发.有时候可能会遇

关于C语言中的强符号、弱符号、强引用和弱引用的一些陋见,欢迎指正

首先我表示很悲剧,在看<程序员的自我修养--链接.装载与库>之前我竟不知道C有强符号.弱符号.强引用和弱引用.在看到3.5.5节弱符号和强符号时,我感觉有些困惑,所以写下此篇,希望能和同样感觉的朋友交流也希望高人指点. 首先我们看一下书中关于它们的定义. 引入场景:(1)文件A中定义并初始化变量i(int i = 1), 文件B中定义并初始化变量i(int i = 2).编译链接A.B时会报错b.o:(.data+0x0): multiple definition of `i':a.o:(.d

浅谈C语言中的强符号、弱符号、强引用和弱引用

摘自http://www.jb51.net/article/56924.htm 浅谈C语言中的强符号.弱符号.强引用和弱引用 投稿:hebedich 字体:[增加 减小] 类型:转载 时间:2014-10-31 我要评论 这篇文章主要介绍了C语言中的强符号.弱符号.强引用和弱引用的定义及相关内容,非常的简单易懂,有需要的朋友可以参考下 首先我表示很悲剧,在看<程序员的自我修养--链接.装载与库>之前我竟不知道C有强符号.弱符号.强引用和弱引用.在看到3.5.5节弱符号和强符号时,我感觉有些困惑

GCC中的弱符号与强符号

我们经常在编程中碰到一种情况叫符号重复定义.多个目标文件中含有相同名字全局符号的定义,那么这些目标文件链接的时候将会出现符号重复定义的错误.比如我们在目标文件A和目标文件B都定义了一个全局整形变量global,并将它们都初始化,那么链接器将A和B进行链接时会报错: [html] view plain copy 1 b.o:(.data+0x0): multiple definition of `global' 2 a.o:(.data+0x0): first defined here 这种符号的

弱符号与强符号,弱引用与强引用

1.弱符号与强符号 对C/C++而言,编译器默认函数和初始化了的全局变量为强符号.未初始化的全局变量为弱符号.此处弱符号与强符号均是针对定义来说的,不是针对符号的引用.也可以通过GCC的 "__attribute__((weak))"来定义任何一个强符号为弱符号. [cpp] view plain copy extern in ext; int weak; int strong = 1; __attribute__((weak)) int weak2 = 1; int main() {

C++中弱符号(弱引用)的意义及实例

今天读别人代码时看到一个“#pragma weak”,一时没明白,上网研究了一个下午终于稍微了解了一点C.C++中的“弱符号”,下面是我的理解,不正确的地方望大家指正. 本文主要从下面三个方面讲“弱符号”: 1. 什么是“弱符号”? 它与“强符号”的区别是什么? 2. 弱符号的有什么作用? 3. 弱符号的实际应用实例 1.什么是弱符号? 在WikiPedia中弱符号的定义是: a weak symbol is a symbol definition in an object file or dy

静态、动态、强和弱类型

对于动态语言与静态语言的区分,套用一句流行的话就是:Static typing when possible, dynamic typing when needed. “动”或“静”,强调的是实施类型的时间,编译里就要确定类型的是静态类型,比如C/C++/JAVA/C#,运行时才实施类型的则是动态类型,比如VB/Python.          而“强”或“弱”刚强调实施类型的强度,强类型的语言,如C++等,变量的类型不可随意转换:而弱类型的语言,变量的类型可以随需要任意转换,而且通常都是隐式的.

INT_MIN 写成 (-2147483647 - 1) 和 vs中 warning C4018: “&gt;”: 有符号/无符号不匹配的深入剖析。

首先明确下4个字节的INT能表示的数字范围是2147483647-- -2147483648,来看我遇到的问题: 这里输出了"相等"说明 (INT_MIN==-2147483648) 为true. 输出了" 1<-2147483648",说明认为 (1<-2147483648) 为true,但是这不科学. 输出了"-1>2147483648"说明 ( -1>2147483648) 为true,这也不科学. INT_MIN和