2019-2020-1 20199308《Linux内核原理与分析》第八周作业
2024-08-24 20:46:08
《Linux内核分析》
第七章 可执行程序工作原理
7.1 知识点
1、目标文件:编译器生成的文件,“目标”指平台,它决定了编译器使用的机器指令集。
2、目标文件格式:a.out(最古老的)→COFE →PE(Windows)→ELF(Linux)
3、ELF: Executable and Linkable Format,可执行的和可链接的格式,是一个目标文件格式的标准。此格式的文件用于存储Linux程序。
4、ELF文件的3种类型:
- 可重定位文件(中间文件)
- 可执行文件(一般由多个可重定位文件结合生成)
- 共享目标文件(共享库,Linux下共享库后缀为.so的文件)
5、ELF文件的作用: - 用于编译和连接(可重定位文件)
- 用于加载执行(可执行文件)
- 共享文件两者都有
6、一个可重定位文件保存着代码和适当的数据,用来和其他的object文件一起来创建一个可执行文件或者是一个共享文件。一个可执行文件保存着一个用来执行的程序;该文件指出了exec(BA_OS)如何来创建程序进程映象。一个共享object文件保存着代码和合适的数据,用来被下面的两个链接器链接。第一个是连接编辑器[请参看ld(SD_CMD)],可以和其他的可重定位和共享object文件来创建其他的object。第二个是动态链接器,联合一个可执行文件和其他的共享object文件来创建一个进程映象。
7、ELF头描述了该文件的组织情况,程序投标告诉系统如何创建一个进程的内存映像,section头表包含了描述文件sections的信息。当系统要执行一个文件的时候,理论上讲,他会把程序段拷贝到虚拟内存中某个段。
8、程序从0x804800开始,可执行文件加载到内存中开始执行的第一行代码,一般静态链接将会把所有代码放在同一个代码段,动态连接的进程会有多个代码段。
9、程序编译
- ①编译器预处理
gcc -E -o XX.cpp XX.c (-m32)//
注:把include的文件包含进来,并且完成宏的替换 - ②汇编器编译成汇编代码
gcc -x cpp-output -S -o hello.s hello.cpp (-m32) - ③汇编代码编译成二进制目标文件
gcc -x assembler -c hello.s -o hello.o (-m32)
注:不可读,含有部分机器代码但不可执行 - ④链接成可执行文件
gcc -o hello.static hello.c (-m32) -static - ⑤hello和hello.o都是ELF文件
- ⑥.static文件会将所有用到C库文件都放到这一个可执行程序中
7.2 实验过程
- 实验内容:Linux内核如何装载和启动一个可执行程
- 更新menu内核
- 查看test.c文件,可以看到新增加了exec系统调用
- 启动内核并验证execv函数
- 冻结内核,启动GDB调试
- 先停在sys_execve处,再设置其它断点;按c一路运行下去直到断点sys_execve
- 退出调试状态,输入readelf -h hello可以查看hello的EIF头部
*struct pt_regs regs就是内核堆栈栈底的部分,发生中断的时候,esp和ip都进行压栈。通过修改内核堆栈中EIP的值(也就是把压入栈中的值用new_ip替换)作为新程序的起点。
最新文章
- 6、ASP.NET MVC入门到精通——ASP.Net的两种开发方式
- nginx(3、负载均衡)
- [Asp.net 5] Configuration-新一代的配置文件(接口定义与基础实现)
- DAY3 python群发短信
- oracle 数据库时间类型为字符串 时间范围大小查询
- c++实现排序(简单插入,希尔,选择,快速,冒泡,堆排)
- LA 2797 (平面直线图PLSG) Monster Trap
- OWIN OAuth 2.0 Authorization Server
- 反引号backtick中输入多个命令
- 20160218.CCPP体系详解(0028天)
- centos7下kubernetes(13。kubernetes-探讨service IP)
- php之swoole安装与基本使用
- 23. 合并K个排序链表
- windows(64位)下使用curl安装
- 第三篇 功能实现(2) (Android学习笔记)
- C#把汉字转换成16进制(HEX)并向串口发送数据
- HTML5练习4
- 卡巴斯基KAV2013 – 免费一年 (六一活动)
- Python3 小工具-僵尸扫描
- Wpf ScrollBar自定义样式