initialization - elf 加载器如何初始化全局变量

标签 initialization global elf

对于 C 中的全局变量,如

int aglobal = 5;

加载程序何时将 5 传输到 aglobal 中,以及它如何知道将 5 放入 aglobal 中。

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

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

最佳答案

在数据部分中创建一个整数大小的空间,其中编码了值 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个字节的实际地址是已知的,所以直接指定

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

相关文章:

arrays - 将数组初始化为固定长度数组的最佳方法是什么? (C++/CLI)

object - C# 在 get 访问器中初始化对象

reactjs - 使用 makeStyles - useStyles() 全局抛出 'Invalid Hook Call' 错误

JavaScript 获取 API : accessing local variable globally

C 程序无法识别全局变量

linux - 如何使用 go1.6.2 为 linux 32 位构建

c - ELF 文件的 .bss 部分应该在哪里占用内存?

c - 如何使结构常量中的函数指针用于初始化常量数组?

c - C语言中 "int arr[] = {}"和 "int arr[]"的区别

c++ - 如何创建 ELF 可执行文件?