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

释放双眼,带上耳机,听听看~!

1
2
1***预处理:gcc –E –o hello.cpp hello.c -m32       (
2

1
2
3
4
5
6
1***可执行文件格式的发展过程:  
2          ->   PE  
3A.out -> COFF  
4          ->   ELF  
5
6

1
2
1***ELF中的三种主要的目标文件
2
  1. 可重定位文件:保存代码和适当的数据,用来和其他object文件一起创建一个可执行文件或一个共享文件。主要是.o文件。

  2. 可执行文件:保存一个用来执行的程序,指出了exec(BA_OS)如何来创建程序进程映象,怎么把文件加载出来以及从哪里开始执行。

  3. 共享文件:保存着代码和数据用来被以下两个链接器链接。一是链接编译器,可以和其他的可重定位和共享文件创建其他的object文件;二是动态链接器,联合一个可执行文件和其他 共享文件来创建一个进程映象。主要是.so文件。


1
2
1***静态链接的ELF可执行文件与进程的地址空间
2

Entry point address:入口地址
一般为0x8048000开始

  其原因是:32位x86的系统有4G的进程地址空间(前面的1G供内核用;之后的3G用户态可访问)当一个ELF可执行文件要加载到内存中时,先把代码段和数据段加载到当中。开始加载时,前面      的都是ELF格式的头部信息,大小不尽相同,根据头部大小可确定程序的实际入口,当启动一个刚加载过可执行文件的进程时,就可从这个位置开始执行。

 一般静态链接会将所有的代码放在同一个代码段;动态链接的进程会有多个代码段。

实验要求:

 

理解编译链接的过程和ELF可执行文件格式,详细内容参考本周第一节;

编程使用exec*库函数加载一个可执行文件,动态链接分为可执行程序装载时动态链接和运行时动态链接,编程练习动态链接库的这两种使用方式,详细内容参考本周第二节;

使用gdb跟踪分析一个execve系统调用内核处理函数sys_execve ,验证您对Linux系统加载可执行程序所需处理过程的理解,详细内容参考本周第三节;推荐在实验楼Linux虚拟机环境下完成实验。

特别关注新的可执行程序是从哪里开始执行的?为什么execve系统调用返回后新的可执行程序能顺利执行?对于静态链接的可执行程序和动态链接的可执行程序execve系统调用返回时会有什么不同?

实验过程:

 进入实验楼环境,使用rm menu -rf命令  删除原来的menu,clone新的menu

 make rootfs命令,重新编译加载内核

 使用exec命令

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

之后使用 -s -S冻结内核

开启gdb调试  

设置断点,并进行跟踪

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

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

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

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

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

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

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

 

给TA打赏
共{{data.count}}人
人已打赏
安全运维

WordPress网站专用docker容器环境带Waf

2020-7-18 20:04:44

安全运维

运维安全-Gitlab管理员权限安全思考

2021-9-19 9:16:14

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索