原创作品转载请注明出处 +《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000
一、实验要求
分析exec*函数对应的系统调用处理过程
二、实验内容
- 理解编译链接的过程和ELF可执行文件格式,详细内容参考本周第一节;
- 编程使用exec*库函数加载一个可执行文件,动态链接分为可执行程序装载时动态链接和运行时动态链接,编程练习动态链接库的这两种使用方式,详细内容参考本周第二节;
- 使用gdb跟踪分析一个execve系统调用内核处理函数sys_execve ,验证您对Linux系统加载可执行程序所需处理过程的理解,详细内容参考本周第三节;推荐在实验楼Linux虚拟机环境下完成实验。
- 特别关注新的可执行程序是从哪里开始执行的?为什么execve系统调用返回后新的可执行程序能顺利执行?对于静态链接的可执行程序和动态链接的可执行程序execve系统调用返回时会有什么不同?
三、实验环境
本地linux环境(ubuntu14.04 64bit)
主要优点:使用方便,方便保存,不受网络影响。
四、实验过程
1.可执行文件的生成过程。
首先引用一张孟老师的图,来说明可执行文件生成的过程,总结的很赞
可执行文件是给计算机中的cpu执行的二进制代码。按照老师上课使用的shell命令演示一下。
hello.static 是静态链接编译的可执行文件,可以很看到,比动态链接编译的hello文件要大得多,相差100倍,原因也很简单,就是静态链接是将程序中需要使用的库都放在了静态编译的文件中,导致文件大小剧增。
演示很简单,两个的效果表面是看不出来的
2.查看elf文件相关信息
对于静态链接的elf文件,基本上在加载时对应加上程序入口地址,将相应的代码数据加载到对应的内存空间中,然后逐步执行代码。以下是我的ELF Header情况。
下面来查看elf头信