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

new*_*guy 6 global initialization elf

对于C中的全局变量

int aglobal = 5;

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

与函数中的静态声明相同的情况.喜欢

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

Mic*_*zek 6

在数据部分中创建一个int大小的空间,其中编码值为5,并且将一个名为"aglobal"的全局非函数符号添加到指向它的符号表中.对aglobal的引用转换为在链接时解析为指向该数据块的重定位,因此在完全链接的图像中,指令将直接从保存5值的内存中的该点加载

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

.data
.globl aglobal
aglobal: .long 5

.text
main:
    mov eax, aglobal
Run Code Online (Sandbox Code Playgroud)

在目标文件中,mov指令将变为mov eax, 0重定位R_386_32 aglobal+0,因为目标文件不确定数据部分在内存中的位置.

在完全链接的图像中,它可能是这样的:

mov eax, 0x804a010
Run Code Online (Sandbox Code Playgroud)

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