2021-2022-1 20212803《Linux内核原理与分析》第八周作业
所学知识
ELF概述
ELF (Executable and Linkable Format)即可执行的和可链接的格式,是一个目标文件格式的标准。ELF格式的文件用于存储Linux程序。ELF是一种对象文件的格式,用于定义不同类型的对象文件中都有什么内容、以什么样的格式放这些内容。ELF首部会描绘整个文件的组织结构,它还包括很多节(sections,是在ELF文件里用以装载内容数据的最小容器),这些节有些是系统定义好的,有些是用户在文件中通过。section命令自定义的,链接器会将多个输入目标文件中相同的节合并。
3种类型:
1.可重定位文件:一般是中间文件,还需要继续处理。由汇编器和编译器创建,一个源代码文件会生成一个可重定位文件。文件中保存着代码和适当的数据,用来和其他的目标文件一起来创建一个可执行文件、静态库文件或者共享目标文件(即动态库文件)。
2.可执行文件:一般由多个可重定位文件结合生成,是完成了所有重定位工作和符号解析(除了运行时解析的共享库符号)的文件,文件中保存着一个用来执行的程序。
3.共享目标文件:共享库,是指可以被可执行文件或其他库文件使用的目标文件,例如标准C的库文件libc.so。可以简单理解为没有主函数main的“可执行”文件,只有一堆函数可供其他可执行文件调用。
作用
ELF文件参与程序的链接和程序的执行,如果用于编译和链接则编译器和链接器把ELRF文件看成节的集合,所有节右表头描述,程序头表可选。
如果用于加载执行,则加载器将ELF文件看成是程序头表描述的段的集合,一个段可能包含多个节和节头表可选。
如果是共享文件,则两者都含有。
实验过程
cd ~/LinuxKernel
rm menu -rf
git clone https://github.com/mengning/menu.git
cd menu
make rootfs
cd ..
qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -S -s
gdb
file linux-3.18.6/vmlinux
target remote:1234
b sys_execve
b load_elf_binary
c
退出调试之后,查看elf文件头
执行 :
readelf -h who1
总结
简单总结一下execve系统调用的执行过程:
- 陷入内核
- 加载新的可执行文件并进行可执行性检查
- 将新的可执行文件映射到当前运行进程的进程空间中,并覆盖原来的进程数据
- 将EIP的值设置为新的可执行程序的入口地址。如果可执行程序是静态链接的程序,或不需要其他的动态链接库,则新的入口地址就是新的可执行文件的main函数地址;如果可执行程序还需要其他的动态链接库,则入口地址是加载器ld的入口地址
- 返回用户态,程序从新的EIP出开始继续往下执行。至此,老进程的上下文已经被新的进程完全替代了,但是进程的PID还是原来的。从这个角度来看,新的运行进程中已经找不到原来的对execve调用的代码了,所以execve函数的一个特别之处是他从来不会成功返回,而总是实现了一次完全的变身。