对于C中的全局变量,如
int aglobal = 5;
什么时候5被加载器转移到aglobal,它如何知道将5放入全局。
与函数中的静态声明相同的情况。像
int afunc() { static int astatic = 8; 回归; }
答案 0 :(得分:6)
在数据部分中创建一个int大小的空间,其中编码值为5,并且将一个名为“aglobal”的全局非函数符号添加到指向它的符号表中。对aglobal的引用转换为在链接时解析为指向该数据块的重定位,因此在完全链接的图像中,指令将直接从保存5值的内存中的那个点加载
例如,(x86)程序集可能类似于:
.data
.globl aglobal
aglobal: .long 5
.text
main:
mov eax, aglobal
在目标文件中,mov指令将变为带有重定位mov eax, 0
的{{1}},因为目标文件不确定数据部分在内存中的位置。
在完全链接的图像中,它可能类似于:
R_386_32 aglobal+0
现在数据部分中4个字节的实际地址是已知的,因此直接指定