编译时:
// external definitions
int value1 = 0;
static int value2 = 0;
gcc 编译器生成以下程序集:
.globl value1
.bss
.align 4
.type value1, @object
.size value1, 4
value1:
.zero 4
.local value2
.comm value2,4,4
但是,当我将变量初始化为非零值时,例如:
// external definitions
int value1 = 1;
static int value2 = 1;
gcc 编译器生成以下内容:
.globl value1
.data
.align 4
.type value1, @object
.size value1, 4
value1:
.long 1
.align 4
.type value2, @object
.size value2, 4
value2:
.long 1
我的问题是:
- 为什么在第一种情况下,值分配在 bss 段中,而在第二种情况下,值分配在数据段中。
- 为什么 value2 变量在第一种情况下被定义为 .local 和 .comm,而在第二种情况下则不是。
一般来说,bss
部分包含未初始化的值和data
部分包含初始化值。然而,gcc 将初始化为零的值放入bss
部分而不是data
部分,作为bss
无论如何,该部分在运行时都会被清零,在该部分中存储零没有多大意义data
部分,这可以节省一些磁盘空间,来自 man gcc:
-fno-zero-initialized-in-bss 如果目标支持 BSS 部分,GCC 默认将初始化为零的变量放入 BSS 中。这
可以节省结果代码的空间。该选项关闭此功能
行为,因为某些程序明确依赖于变量
数据部分
我不知道为什么.comm
与使用static存储是目标文件的本地存储,通常用于声明公共符号,如果not定义/初始化,应由链接器与其他目标文件中具有相同名称的符号合并,这就是第二个示例中未使用它的原因,因为变量是从as
manual http://sourceware.org/binutils/docs-2.20/as/Comm.html#Comm
.comm 声明一个名为symbol 的通用符号。链接时,通用
一个目标文件中的符号可以与定义的或公共的符号合并
另一个目标文件中的同名符号
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)