Linux内核如何装载和启动一个可执行程序

Linux内核如何装载和启动一个可执行程序

沙雨济
原创作品转载请注明出处   《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000 
 
一 、实验目的
       理解编译链接的过程和ELF可执行文件格式;编程使用exec*库函数加载一个可执行文件,动态链接分为可执行程序装载时动态链接和运行时动态链接,编程练习动态链接库的这两种使用方式;使用gdb跟踪分析一个execve系统调用内核处理函数sys_execve ,验证您对Linux系统加载可执行程序所需处理过程的理解;特别关注新的可执行程序是从哪里开始执行的?为什么execve系统调用返回后新的可执行程序能顺利执行?对于静态链接的可执行程序和动态链接的可执行程序execve系统调用返回时会有什么不同?
 
二 、实验内容
首先,进入实验楼编程环境,进入LinuxKernel文件夹,删除menu,再clone一份新的。
技术分享 

然后,进入menu文件夹,将test_exec.c覆盖test.c,make rootfs。
技术分享 

然后,请来大小s,水平分割编程界面,开始进行gdb跟踪。
技术分享 

接着,进行断点的设置:sys_execve, load_elf_binary, start_thread。然后单步执行,至结束。
技术分享 

接着,可调出list,进行内部跟踪,可查看入口点地址。
 
三 、实验总结
         首先创建新进程,然后新进程调用execve()系统调用执行指定的ELF文件,之后再调用内核的入口函数sys_execve(),sys_execve()服务例程修改当前进程的执行上下文;以上系统调用终止后,新进程开始执行放在可执行文件中的代码,也就是执行在当前目录下显示文件的功能。 当ELF被load_elf_binary()装载完成后,函数返回至do_execve()在返回至sys_execve()。ELF可执行文件的入口点取决于程序的链接方式,对于静态链接的可执行文件,若是静态链接的,elf_entry就是指向可执行文件里边规定的那个头部,即main函数对应的位置,若这个可执行文件是需要依赖其它动态链接库的话,则elf_entry就是指向动态链接器的起点。

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。