【发布时间】:2011-02-08 14:40:06
【问题描述】:
对于像 C 语言中的全局变量
int aglobal = 5;
加载器何时将 5 转移到 aglobal 中,如何知道将 5 放入 aglobal 中。
函数中的静态声明也是如此。喜欢
int afunc() { 静态 int astatic = 8; 返回非静态; }
【问题讨论】:
标签: initialization global elf
对于像 C 语言中的全局变量
int aglobal = 5;
加载器何时将 5 转移到 aglobal 中,如何知道将 5 放入 aglobal 中。
函数中的静态声明也是如此。喜欢
int afunc() { 静态 int astatic = 8; 返回非静态; }
【问题讨论】:
标签: initialization global elf
在数据段中创建了一个 int 大小的空间,其中编码了值 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个字节的实际地址已知,所以直接指定
【讨论】: