吕松鸿 原创做品转载请注明出处 《Linux内核分析》MOOC课程 http://mooc.study.163.com/course/USTC-1000029000shell
c代码->预处理->汇编代码->汇编器->目标代码->连接成可执行文件->加载到内核执行函数
符号修饰标准、变量内层布局、函数调用方式等这些跟可执行代码二进制兼容性相关的内容称为ABI(Application Binary Interface)布局
常见的ABI格式:spa
通常静态连接将会把全部代码放在同一个代码段。命令行
动态链接的进程会有多个代码段。3d
命令行参数和shell环境,通常咱们执行一个程序的Shell环境,咱们的实验直接使用execve系统调用。
Shell自己不限制命令行参数的个数, 命令行参数的个数受限于命令自身。
shell会调用execve将命令行参数和环境参数传递给可执行程序的main函数。
命令行参数和环境串都放在用户态堆栈中。
动态连接分为可执行程序装载时动态连接和运行时动态连接
通常是地址空间为0x8048000或0x8048300
execve和fork都是特殊一点的系统调用:通常的都是陷入到内核态再返回到用户态。
fork两次返回,第一次返回到父进程继续向下执行,第二次是子进程返回到ret_from_fork而后正常返回到用户态。code
execve执行的时候陷入到内核态,用execve中加载的程序把当前正在执行的程序覆盖掉,当系统调用返回的时候也就返回到新的可执行程序起点。blog
- 执行到可执行程序 -> 陷入内核 - 构造新的可执行文件 -> 覆盖掉原可执行程序 - 返回到新的可执行程序,做为起点(也就是main函数) - 须要构造其执行环境;