如何通过elf加载器初始化全局变量

时间:2010-04-15 22:08:01

标签: initialization global elf

对于C中的全局变量,如

int aglobal = 5;

什么时候5被加载器转移到aglobal,它如何知道将5放入全局。

与函数中的静态声明相同的情况。像

int afunc() {    static int astatic = 8;    回归; }

1 个答案:

答案 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个字节的实际地址是已知的,因此直接指定