对于C中的全局变量,例如

int aglobal = 5;

5何时由加载程序转移到aglobal中,如何知道将5放入aglobal中。

在函数中使用静态声明的情况相同。喜欢

int afunc()
{
static int astatic = 8;
返回静态
}

最佳答案

在数据节中形成一个int大小的空间,在其中编码了值5,并将一个名为'aglobal'的全局非功能符号添加到指向它的符号表中。对全局变量的引用将转换为重定位,该重定位在链接时解析为指向该数据块,因此在完全链接的镜像中,指令将直接从保存5值的内存中的该点加载。

例如,(x86)程序集可能类似于:

.data
.globl aglobal
aglobal: .long 5

.text
main:
    mov eax, aglobal

在目标文件中,mov指令将变为带有重定位mov eax, 0R_386_32 aglobal+0,因为该目标文件不确定该数据段将在内存中的位置。

在完全链接的图像中,可能类似于:
mov eax, 0x804a010

现在,数据部分中4个字节的实际地址是已知的,因此可以直接指定

关于initialization - elf加载程序如何初始化全局变量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2649333/

10-13 04:55