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系统调用返回后新的可执行程序能顺利执行? 因为在系统调用过程中,父进程的大部分资源被抛弃,堆栈被清空,新的可执行程序根据传递的参数和环境变量配置了一个新的堆栈。所以返回时能够正常执行。

原文地址:https://www.cnblogs.com/w741741/p/11820687.html