2019-2020-1 20199323《Linux内核原理与分析》第八周作业
1、编译链接的过程
程序从源代码到可执行文件的步骤:预处理、编译、汇编、链接。指令分别为:
- 预处理:
- gcc -E hello.c -o hello.i
- 编译:
- gcc -S hello.i -o hello.s
- 汇编:
- gcc -c hello.s -o hello.o
- 链接:
- gcc hello.o -o hello -m32 -static
2、elf文件的格式:
3、实验部分:
首先更新内核,然后进入menu里面将test_exec.c替换test.c的内容:
然后启动内核,输入fork和exec进行验证是否有这两个函数:
然后设置断点sys_execve,然后按c停在断点处:
第三个断点start_thread处,可以看到修改了eip的值,它作为新程序的起点:
输入readelf -h hello可以查看hello的EIF头部:
4、问题解析
新的可执行程序执行的起点在修改调用execve系统调用时压入内核堆栈的eip寄存器的值。
为什么execve系统调用返回后新的可执行程序能顺利执行? 因为在系统调用过程中,父进程的大部分资源被抛弃,堆栈被清空,新的可执行程序根据传递的参数和环境变量配置了一个新的堆栈。所以返回时能够正常执行。