【嵌入式ARM汇编基础】-ELF文件格式内部结构详解(四)
ELF文件格式内部结构详解(四)
文章目录
- ELF文件格式内部结构详解(四)
- 15、ELF 程序初始化和终止部分
- 15.1 初始化和终止顺序
- 16、线程局部存储
- 16.1 本地执行 TLS 访问模型
- 16.2 Initial-Exec TLS 访问模型
- 16.3 通用动态 TLS 访问模型
- 16.4 本地动态 TLS 访问模型
15、ELF 程序初始化和终止部分
一旦程序加载到内存中,其依赖关系得到满足,并且已正确重定位并链接到其共享库依赖项,加载器就可以准备启动程序的核心程序代码了。但在执行此操作之前,它首先需要运行程序的初始化例程。
从语义上讲,C 和 C++ 程序都从包含核心程序逻辑的主函数开始执行,并在主函数返回后立即退出。然而,实际情况要复杂得多。
在 C 编程语言中,类型系统相对有限。定义全局变量时,它们可以静态初始化为某个常量值,也可以保持未初始化状态。在上一节中,我们看到,如果变量已初始化,则变量的初始值将放置在 .data 段中,而未初始化的变量将放置在 .bss 段中。此过程称为静态初始化全局变量。
C++ 编程语言则更为复杂。 C++ 变量可以使用复杂的程序员定义类型,例如类,这些类型可以定义构造函数,使其在变量进入作用域时自动运行,并定义析构函数,使其在变量离开作用域时自动运行。对于全局变量,这些变量在调用 main 函数之前进入作用域,并在程序退出或共享库卸载时离开作用域。此过程称为动态初始化。
以下程序为具体示例: