作业信息
这个作业属于哪个课程 | <2020-2021-1Linux内核原理与分析)> |
---|---|
这个作业要求在哪里 | <2020-2021-1Linux内核原理与分析第八周作业> |
这个作业的目标 | <Linux内核装载和启动一个可执行程序> |
作业正文 | https://www.cnblogs.com/houyunzhe/p/14052060.html |
一、实验过程
1、输入如下代码,先将menu目录删除,利用git命令克隆一个新的menu目录,然后用test_exec.c将test.c覆盖;
git clone https://github.com/mengning/menu.git
cd menu
mv test_exec.c test.c
刚添加的exec的代码如下所示
2、用make rootfs
重新编译,在QEMU中利用help命令查看,并执行exec命令
3、使用qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -S -s
冻结内核并进行调试,
打开gdb,通过端口1234建立连接,在sys_exec、load_elf_binary、start_thread处设置断点;
4、退出调试之后,使用readelf命令查看elf文件头,如下所示。
二、实验收获
1、ELF概述
(1)“目标文件”指编译器生成的文件,“目标”指类似x86或x64的目标平台,它决定编译器使用的机器指令集。
(2)“目标文件”也叫ABI,它和“目标平台”是二进制兼容的。
(3)最古老的目标文件格式是a.out,后来发展为COFF格式,现在linux常用的格式为ELF。
(4)ELF(Executable and Linkable Format)即可执行并可链接的格式,是一个目标文件格式的标准。
(5)ELF是一种对象文件的格式,用于定义不同类型的对象文件中都有什么内容,以什么样的格式放这些内容。
(6)ELF在首部会描绘整个文件的组织结构,还包括了很多系统定义的以及用户自定义的节。
2、ELF文件的3种类型
(1)可重定位文件:一般是中间文件,还需要继续处理。由编译器和汇编器创建,一个源代码文件会生成一个可重定位文件。
内核编译中.o文件便是可重定位目标文件,最后所有的.o文件链接为一个文件,即linux内核
(2)可执行文件:一般由多个可重定位文件结合生成,是完成了所有重定位工作和符号解析的文件。
(3)共享目标文件:共享库,指可以被可执行文件或其他库文件使用的目标文件。
可以理解为没有主函数main的“可执行”文件,只有一堆函数可供其他可执行文调用。
linux下共享库后缀为.so文件,so代表shared object。
3、静态链接与动态链接
静态链接
在编译链接时直接将需要的执行代码复制到最终可执行文件中。
代码的装载速度快,执行速度也比较快,对外部的环境依赖度低。
编译时它会把需要的所有代码都链接进去,应用程序相对比较大。
动态链接
在编译时不直接复制可执行代码,而是通过记录一系列符号和参数,在程序运行或加载时将这些信息传递给操作系统。
装载时动态链接
这种用法的前提是在编译之前已经明确知道要调用DLL中的哪几个函数,编译时在目标文件中只保留必要的链接信息,而不含DLL函数的代码。
当程序执行时,调用函数的时候利用链接信息加载DLL函数代码并在内存中将其链接入调用程序的执行空间中(全部函数加载进内存),其主要目的是便于代码共享。
运行时动态链接
这种方式是指在编译之前并不知道将会调用哪些DLL函数,完全是在运行过程中根据需要决定应调用哪个函数,将其加载到内存中(只加载调用的函数进内存),并标识内存地址,其他程序也可以使用该程序,并用LoadLibrary和GetProcAddress动态获得DLL函数的入口地址。