ELF

学名:
可执行链接文件
背景:(为什么需要这个文件)在linux系统,程序执行依赖于Cpu,程序加载存储是在内存中。诉求:有个设计,就是讲程序运行的命令和数据赋予某个载体中 这样我们可以控制程序的加载或者卸载。这样让系统就有灵活性。
ELF就应运而生了。
ELF设计包括文件头,段,section分布;
如何创造
main.cpp 汇编代码 .o(可充定位文件) 可执行文件或者共享文件.so 。C代码简单的说 ,转换为计算机可理解的汇编代码。可重定位的目标文件过程内部存在汇编。可重定位目标文件:二进制代码和数据,由各个数据节(section)构成,从地址0开始。其实他也是ELF文件,内部存在. text .data . bss .symtab ELF参考:https://blog.****.net/nestler/article/details/37593735
https://blog.****.net/mazongshan1/article/details/37936971
链接的过程:其实就是把把相同的section 合到一个模块
ELF
如何使用:
linux系统中每个程序都运行在一个进程上下文中,这个进程上下文有自己的虚拟地址空间。当shell运行一个程序时,父shell进程生成一个子进程,它是父进程的一个复制品。子进程通过execve系统调用启动加载器。加载器删除子进程已有的虚拟存储段,并创建一组新的代码、数据、堆、栈段,新的堆和栈被初始化为零。通过将虚拟地址空间中的页映射到可执行文件的页大小组块,新的代码和数据段被初始化为可执行文件的内容,最后将CUP指令寄存器设置成可执行文件入口,启动运行。
执行完上述操作后,其实可执行文件的真正指令和数据都没有别装入内存中。操作系统只是通过可执行文件头部的信息建立起可执行文件和进程虚拟内存之间的映射关系而已。现在程序的入口地址为0x08048000,刚好是代码段的起始地址。当CPU打算执行这个地址的指令时,发现页面0x8048000~0x08049000(一个页面一般是4K)是个空页面,于是它就认为是个页错误。此时操作系统根据虚拟地址空间与可执行文件间的映射关系找到页面在可执行文件中的偏移,然后在物理内存中分配一个物理页面,并在虚拟地址页面与物理页面间建立映射,最后把文件中页面拷贝到物理页面,进程重新开始执行。
ELF
如何观察
readef