对于 C 中的全局变量,如
int aglobal = 5;
加载程序何时将 5 传输到 aglobal 中,以及它如何知道将 5 放入 aglobal 中。
与函数中的静态声明相同的情况。喜欢
int afunc()
{
静态 int astatic = 8;
返回静止状态;
}
最佳答案
在数据部分中创建一个整数大小的空间,其中编码了值 5,并将名为“aglobal”的全局非函数符号添加到指向它的符号表中。对 aglobal 的引用被转换为重定位,在链接时解析为指向该数据块,因此在完全链接的图像中,指令将直接从内存中保存 5 值的那个位置加载
例如,(x86) 程序集可能类似于:
.data
.globl aglobal
aglobal: .long 5
.text
main:
mov eax, aglobal
在目标文件中, mov 指令会变成
mov eax, 0
与搬迁 R_386_32 aglobal+0
,因为目标文件不确定数据部分在内存中的位置。在完全链接的图像中,它可能类似于:
mov eax, 0x804a010
现在数据段中4个字节的实际地址是已知的,所以直接指定
关于initialization - elf 加载器如何初始化全局变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2649333/