ELF格式
可加载文件格式
每一个.开头的都是一个section。
.text:机器代码
.data:已初始化的数据段,包括全局变量和static变量
.bss:未初始化的全局变量以及所有被初始化为0的全局变量,这个段的目的时为了节省空间
.rodata:只读数据,比如printf中的字符串
.comment:编译器版本信息
.shstrtab:section名称表
Section header table:节头部表,描述目标文件的节
.rel.text:调用外部函数时,实际调用位置的列表
.rel.data:被模块引用的全局变量的重定位信息
.symtab:符号表,包括函数和全局变量,由编译器构造
.debug:调试符号表,包括局部变量和类型定义,全局变量,以及原始的源文件,只有打开-g编译开关才有
.strtab:字符串表,包括.symtab和.debug节中符号表
可执行文件格式
.init:程序初始化时调用_init函数
program header table:elf文件加载到内存中时的映射需求
加载过程
调用操作系统加载器 loader,加载器讲可执行文件中的代码和数据从磁盘复制到内存中,然后跳转到程序的第一条指令运行。
程序入口函数_start
_libc_start_main初始化执行环境,调用main函数,处理main的返回值。加载过程就是把progam段映射到内存的过程,注意不是数据拷贝,只有CPU引用被映射的虚拟页时才会被复制到内存。
动态链接库
在内存中,共享库的.text节的一个副本能被不同的正在运行的进程共享。
编译时,链接器只复制了一些重定位和符号表信息。在加载时,链接器会重定位库的文本和数据到某个内存段,再重定位可执行程序中所有对动态链接库的符号的引用。
.plt:过程链接表