第七周——可执行程序的装载
2016-04-09 21:20
204 查看
【洪韶武 原创作品转载请注明出处 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000 】
[b]第七章 可执行程序的装载[/b]
[b]一、可执行程序的生成[/b]
可执行程序的生成:
c语言代码--->经过编译器的预处理--->编译成汇编代码--->由汇编器编译成目标代码--->链接成可执行文件
预处理负责把include的文件包含进来及宏替换等工作
[b]二、目标文件的格式[/b]
目标文件:
以".o"作为后缀的文件
可执行文件
常用的目标文件格式:
PE文件:Windos操作系统
ELF文件:Linux操作系统(可执行,可链接)
以ELF文件为例:(目标文件)
可重定位文件(.o文件)
可执行文件
共享目标文件
[b]三、静态链接的ELF可执行文件与进程的地址空间[/b]
默认从0x8048000处开始加载,可执行文件加载到内存中开始执行的第一行代码,一般静态链接会将所有代码放在一个代码段,动态链接的进程会有多个代码段,装载可执行程序之前的工作,可执行程序的执行环境。
[b]四、命令行参数[/b]
shell命令行
main函数的参数
execve的参数
命令行参数和环境串都放在用户态堆栈中
在创建一个新的用户态堆栈的时候,实际上是把命令行参数的内容和环境变量的内容通过指针的方式传递到系统调用的内核处理函数的,内核处理函数在创建一个新的可执行堆栈的时候会将命令行参数的内容和环境变量的内容拷贝到用户态堆栈里面来初始化新的可执行程序执行的上下文环境
shell程序 -> execve -> sys_execve
先函数调用参数传递,在系统调用参数传递
[b]五、装载时动态链接和运行时动态链接应用举例[/b]
动态链接分为可执行程序装载时动态链接和运行时动态链接
准备.so文件
编译成libshlibexample.so文件
编译成libdllibexample.so文件
分别以共享库和动态加载共享库的方式使用libshlibexample.so文件和libdllibexample.so文件
编译main
[b]六、可执行程序的装载[/b]
可执行程序的装载相关关键问题分析
sys_execve内部会解析可执行文件格式
do_execve -> do_execve_common -> exec_binprm
sys_execve的内部处理过程
装载和启动一个可执行程序依次调用以下函数:
sys_execve() -> do_execve() -> do_execve_common() -> exec_binprm() -> search_binary_handler() -> load_elf_binary() -> start_thread()
[b]七、实验过程[/b]
[b]
[/b]
[b]第七章 可执行程序的装载[/b]
[b]一、可执行程序的生成[/b]
可执行程序的生成:
c语言代码--->经过编译器的预处理--->编译成汇编代码--->由汇编器编译成目标代码--->链接成可执行文件
预处理负责把include的文件包含进来及宏替换等工作
[b]二、目标文件的格式[/b]
目标文件:
以".o"作为后缀的文件
可执行文件
常用的目标文件格式:
PE文件:Windos操作系统
ELF文件:Linux操作系统(可执行,可链接)
以ELF文件为例:(目标文件)
可重定位文件(.o文件)
可执行文件
共享目标文件
[b]三、静态链接的ELF可执行文件与进程的地址空间[/b]
默认从0x8048000处开始加载,可执行文件加载到内存中开始执行的第一行代码,一般静态链接会将所有代码放在一个代码段,动态链接的进程会有多个代码段,装载可执行程序之前的工作,可执行程序的执行环境。
[b]四、命令行参数[/b]
shell命令行
main函数的参数
execve的参数
命令行参数和环境串都放在用户态堆栈中
在创建一个新的用户态堆栈的时候,实际上是把命令行参数的内容和环境变量的内容通过指针的方式传递到系统调用的内核处理函数的,内核处理函数在创建一个新的可执行堆栈的时候会将命令行参数的内容和环境变量的内容拷贝到用户态堆栈里面来初始化新的可执行程序执行的上下文环境
shell程序 -> execve -> sys_execve
先函数调用参数传递,在系统调用参数传递
[b]五、装载时动态链接和运行时动态链接应用举例[/b]
动态链接分为可执行程序装载时动态链接和运行时动态链接
准备.so文件
编译成libshlibexample.so文件
编译成libdllibexample.so文件
分别以共享库和动态加载共享库的方式使用libshlibexample.so文件和libdllibexample.so文件
编译main
[b]六、可执行程序的装载[/b]
可执行程序的装载相关关键问题分析
sys_execve内部会解析可执行文件格式
do_execve -> do_execve_common -> exec_binprm
sys_execve的内部处理过程
装载和启动一个可执行程序依次调用以下函数:
sys_execve() -> do_execve() -> do_execve_common() -> exec_binprm() -> search_binary_handler() -> load_elf_binary() -> start_thread()
[b]七、实验过程[/b]
[b]
[/b]
相关文章推荐
- UVA-12096 The SetStack Computer
- 图的拓补排序基本算法
- Linux 下wifi 驱动开发(一)—— WiFi基础知识解析
- log4j.properties 详解与配置步骤
- uva 202 Repeating Decimals
- uva 10340 All in All
- 关于apache上的CGI文件问题总结--为什么无法找到cgi文件、为什么找到了cgi文件却不执行反而询问是否下载或直接显示文件代码
- java中的回调函数理解
- linux下查找某个文件位置的方法
- Android MotionEvent 和 TouchSlop
- 2016.04.09 使用Powerdesigner进行创建数据库的概念模型并转为物理模型
- win10安装提示组件存储损坏的解决探讨(附DISM命令的简单使用)
- c语言编写求解数独
- 【剑指 offer】(二十二)—— 栈的压入、弹出序列
- 古老编程环境展——LFS Linux篇
- 三言两语说shader(七)黑幕扩散
- 解决android EditText自动获取焦点的问题
- uva 1587 Box
- HDU 4715 Difference Between Primes (筛法求素数)
- xshell利用linux rz sz 命令上传、下载文件