gcc中no-common的说明
来源:互联网 发布:淘宝 电子发票 编辑:程序博客网 时间:2024/06/18 05:51
对于链接器来说,所有的全局符号可分为两种:强符号(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选项。
- gcc中no-common的说明
- gcc优化的简单说明
- GCC优化选项的说明
- DotNet.Common 命名空间的来源说明
- DotNet.Common 命名空间的来源说明
- DotNet.Common 命名空间的来源说明
- common error in GCC
- gcc编译器实验---对gcc编译参数的详细说明
- 简单说明gcc和arm-linux-gcc的区别
- GCC编译程序时的四个阶段说明!
- gcc 的-I,-L,-l说明
- 关于gcc-4.8.1的安装说明
- GCC编译时的警告说明
- AVR的GCC中断向量说明
- DB2 LOAD命令中COPY NO/COPY YES/NONRECOVERABLE的说明
- Linux中编译文件时提示:arm-elf-gcc: leds.o : No such file or directory 错误的解决办法
- apache common-logging 和 log4j的相关说明
- ./configure的时候容易遇到gcc... no的错误
- 用VC直接读写excel中的数据
- 缓存的几个
- windows程序设计第四章sysmets3程序详解
- GNU Grub
- 西电-陈怀琛教授
- gcc中no-common的说明
- 保存DC到BMP文件 win32
- 如何定制标题栏
- Cache在CPU中的作用
- .net Framework 和asp.net的运行原理及运行机制
- 稳定性才是商业软件和实验室产品的区别所在。。。
- 构建和实现单点登录解决方案
- 标准C++实现反射特性
- 关于找工作