.bss与COMMON以及它们之间的区别

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/weixin_43730678/article/details/88849719

.bss与COMMON

.bss中存放,未初始或者被初始化为0的全局变量以及静态变量。在目标文件中.bss section不占据实际的空间,只是一个占位符。目标格式文件区分已初始化与未初始化变量是为了空间效率:在目标文件中,未初始化变量不需要占据任何实际的磁盘空间,运行时,分配这些变量,初始值为0;

COMMON在节头部表中没有条目,是一个特殊的伪节(oseudosection),表示还未被分配位置的未初始化的的数据目标。

COMMON和.bss的区别

COMMON和.bss的区别很细微,现代的版本根据以下规则来将可重定位目标文件的符号分配到COMMON和.bss中

COMMON--------------未初始化的全局变量
.bss ---------------------未初始化的静态变量,以及初始化为0的全局变量或静态变量

为什么采取这两种方式来分配全局和静态变量的符号?

采取这两种看起来很绝对的区分方式的原因来自于连接执行符号解析的方式。在某些情况下连接器允许多个模块定义同名的全局符号。当编译器材翻译某个符号时,遇到一个弱全局符号(已初始化的全局变量是强全局符号,未初始化的全局变量是弱全局符号),比如一个未初始化的全局变量x,编译器无法知道其他模块是否也定义了这个x。如果其他模块也定义了x,编译器无法预测连接器该使用x的多重定义中的哪一个。所以编译器把x分配给COMMON,把决定权留给连接器。另一方面,如果x初始化为0,那么他就是一个强全局符号,根据连接器的规则如果有一个强符号和一个弱符号,那么选择强符号。所以编译器会直接把x给.bss。类似的,静态符号的构造就必须是唯一的,所以编译器可以自信的把他们分配到.data或.bss。

猜你喜欢

转载自blog.csdn.net/weixin_43730678/article/details/88849719
今日推荐