实验七 Linux 内核如何装载和启动一个可执行程
一、实验步骤
1、将menu目录删除,利用git命令克隆一个新的menu目录
2、用test_exec.c覆盖test.c,重新编译rootfs。使用help命令,发现多了exec命令
查看代码看到新增的exec函数
3、输入以下指令:qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -S -s,打开qemu界面进入暂停状态:
再次打开一个终端界面,进入LinuxKernel文件夹下,输入gdb,连接vmlinux文件,在sys_execve、load_elf_binary和b start_thread处设置断点
4、查看hello(ELF文件)的头部信息
二、ELF文件格式
2.1 定义
ELF (Executable and Linkable Format)即可执行的和可链接的格式,是一个目标文件格式的标准。ELF格式的文件用于存储Linux程序。ELF是一种对象文件的格式,用于定义不同类型的对象文件中都有什么内容、以什么样的格式放这些内容。ELF首部会描绘整个文件的组织结构,它还包括很多节(sections,是在ELF文件里用以装载内容数据的最小容器),这些节有些是系统定义好的,有些是用户在文件中通过。section命令自定义的,链接器会将多个输入目标文件中相同的节合并。
2.2 ELF文件的3种类型
1、可重定位文件
这种一般是中间文件,还需要继续处理。由汇编器和编译器创建,一个源代码文件会生成一个可重定位文件。文件中保存着代码和适当的数据,用来和其他的目标文件一起来创建一个可执行文件、静态库文件或者共享目标文件(即动态库文件)。
2、可执行文件
一般由多个可重定位文件结合生成,是完成了所有重定位工作和符号解析(除了运行时解析的共享库符号)的文件,文件中保存着一个用来执行的程序。
3、共享目标文件
共享库,是指可以被可执行文件或其他库文件使用的目标文件,例如标准C的库文件libc.so。可以简单理解为没有主函数main的“可执行”文件,只有一堆函数可供其他可执行文件调用。
2.3 ELF文件格式分析
一般的 ELF 文件包括三个索引表:ELF header,Program header table,Section header table。
1)ELF header:在文件的开始,保存了路线图,描述了该文件的组织情况。
2)Program header table:告诉系统如何创建进程映像。用来构造进程映像的目标文件必须具有程序头部表,可重定位文件不需要这个表。
3)Section header table :包含了描述文件节区的信息,每个节区在表中都有一项,每一项给出诸如节区名称、节区大小这类信息。用于链接的目标文件必须包含节区头部表,其他目标文件可以有,也可以没有这个表。