作业信息
这个作业属于哪个课程 | <2020-2021-1Linux内核原理与分析)> |
---|---|
这个作业要求在哪里 | <2020-2021-1Linux内核原理与分析第八周作业> |
这个作业的目标 | 学习Linux内核如何装载和启动一个可执行程序 |
作业正文 | https://www.cnblogs.com/ZHANGwg11/p/14053196.html |
1.更新linux/kernel下的menu,并将exec添加进MenuOs中
下面是更新的代码信息
rm -rf menu
git clone https://github.com/mengning/menu.git
cd menu
mv test_exec.c test.c
qemu -kernel ../linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -S -s
吸取了上次博客的经验 直接使用-s 避免在调试的时候连接超时
下面是运行的结果截图:
MenuOS运行效果如下,可以看到已经增加了一条exec命令
重新打开一个shell窗口,启动gdb,通过端口1234建立连接,在sys_exec、load_elf_binary、start_thread处设置断点
gdb
file linux-3.18.6/vmlinux
target remote:1234
//设置断点
b sys_exec
b load_elf_binary
b start_thread
2.调试
调试过程:
查看hello的EIF头部
readelf -h hello
3.总结
ELF文件头中定义了ELF模数,文件机器字节长度,数据存储方式,版本,运行平台,ABI版本,ELF重定位类型,硬件平台,硬件平台版本,入口地址,程序头入口和长度,段表的位置和长度,段的数量。预处理过程,编译器将C程序的头文件编译进来,还有宏的替换,可以用gcc的参数-E来参看。编译过程,这个阶段编译器主要做词法分析、语法分析、语义分析等,在检查无错误后后,把代码翻译成汇编语言。可用gcc的参数-S来参看。汇编过程,汇编器as将louhao.s 翻译成机器语言保存在louhao.o 中(二进制文本形式)。链接过程,链接器负责处理多个.o文件的并入,结果得到louhao文件,它就是一个可执行的目标文件。
ELF中有三种不同类型的目标文件:可重定位文件、可执行文件、共享目标文件:
(1)可重定位文件:这种文件一般是中间文件,还需要继续处理。由编译器和汇编器创建,一个源代码文件会生成一个可重定位文件。用来和其他的目标文件一起来创建一个可执行文件、静态库文件或者共享目标文件(即动态库文件)。读者在编译Linux内核时可能会注意到,每个内核源代码.c文件都会生成一个同名的.o文件,该文件即为可重定位目标文件,最后所有的.o文件会链接为一个文件,即Linux内核。
(2)可执行文件:一般由多个可重定位文件结合生成,是完成了所有重定位工作和符号解析(除了运行时解析的共享库符号)的文件,文件中保存着一个用来执行的程序。
(3)共享目标文件:共享库,是指可以被可执行文件或其他库文件使用的目标文件。Linux下共享库后缀为.so的文件,so代表shared object。
ELF文件的作用是参与程序的链接(建立一个程序)和程序的执行(运行一个程序)。