20135327郭皓--Linux内核分析第七周 可执行程序的装载
第七周 可执行程序的装载
郭皓 原创作品转载请注明出处 《Linux内核分析》MOOC课程 http://mooc.study.163.com/course/USTC-1000029000
一、预处理,编译,链接和目标文件格式
1.可执行程序是怎么得来的

c代码->预处理->汇编代码->汇编器->目标代码->链接成可执行文件->加载到内核执行
2.目标文件的格式ELF
符号修饰标准、变量内层布局、函数调用方式等这些跟可执行代码二进制兼容性相关的内容称为ABI(Application Binary Interface)
常见的ABI格式:


3.静态链接的ELF可执行文件和进程的地址空间

一般静态链接将会把所有代码放在同一个代码段。

动态连接的进程会有多个代码段。

二、可执行程序、共享库和动态链接
1.可执行程序的执行环境
- 命令行参数和shell环境,一般我们执行一个程序的Shell环境,我们的实验直接使用execve系统调用。
- Shell本身不限制命令行参数的个数,命令行参数的个数受限于命令自身。
- shell会调用execve将命令行参数和环境参数传递给可执行程序的main函数。
- 命令行参数和环境串都放在用户态堆栈中。
2.装载时动态链接和运行时动态链接应用举例
- 动态链接分为可执行程序装载时动态链接和运行时动态链接
三、可执行程序的装载
1.可执行程序的装载相关关键问题分析
execve与fork是比较特殊的系统调用
execve用它加载的可执行文件把当前的进程覆盖掉,返回之后就不是原来的程序而是新的可执行程序起点
fork函数从ret_ from_fork开始执行然后返回用户态
2.sys_execve内核处理过程
do_execve -> do_execve_common -> exec_binprm
do_execve
do_open_exec(filename)打开要加载的文件
命令行参数,结构体变量copy到bprm结构体中
exce_binprm(bprm),关键代码是寻找能解析当前文件的处理模块
register_binfmt($elf_format)注册这个格式到链表里,然后寻找能处理的模块
ELF可执行文件默认映射到0x8048000这个地址
需要动态链接的可执行文件先加载连接器ld;否则直接把elf文件entry地址赋值给entry即可。
start_thread(regs, elf_entry, bprm->p)会将CPU控制权交给ld来加载依赖库并完成动态链接;对于静态链接的文件elf_entry是新程序执行的起点
3.动态链接的可执行程序的装载
- 动态链接库的依赖关系会形成一个图。
- load_elf_interp实际加载动态链接器,entry返回的是动态链接器的入口,根据需求加载动态链接库,根据库的需要再加载更多的库。
四、实验 Linux内核如何装载和启动一个可执行程序
1.下载新的代码文件


2.运行和gdb跟踪断点


20135327郭皓--Linux内核分析第七周 可执行程序的装载的更多相关文章
- Linux内核分析 第七周 可执行程序的装载
张嘉琪 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 Linux内核分析 第七 ...
- Linux内核分析第七周———可执行程序的装载
Linux内核分析第七周---可执行程序的装载 李雪琦+原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/US ...
- 20135327郭皓--Linux内核分析第三周 构造一个简单的Linux系统MenuOS
Linux内核分析第三周 构造一个简单的Linux系统MenuOS 前提回顾 1.计算机是如何工作的三个法宝 1.存储程序计算机 2.函数调用堆栈 3.中断 2.操作系统的两把宝剑 中断上下文的切换 ...
- 20135327郭皓--Linux内核分析第五周 扒开系统调用的三层皮(下)
Linux内核分析第五周 扒开系统调用的三层皮(下) 郭皓 原创作品转载请注明出处 <Linux内核分析>MOOC课程 http://mooc.study.163.com/course/U ...
- LINUX内核分析第七周——可执行程序的装载
一.得到一个可执行程序 1. 预处理.编译.链接 gcc hello.c -o hello.exe gcc编译源代码生成最终可执行的二进制程序,GCC后台隐含执行了四个阶段步骤. 预处理 => ...
- 20135327郭皓--Linux内核分析第八周 进程的切换和系统的一般执行过程
第八周 进程的切换和系统的一般执行过程 一.进程切换的关键代码switch_to分析 1.进程调度与进程调度的时机分析 不同类型的进程有不同的调度需求 第一种分类: I/O-bound:频繁进行I/O ...
- 20135327郭皓--Linux内核分析第六周 进程的描述和进程的创建
进程的描述和进程的创建 一.进程的描述 操作系统三大功能: 进程管理 内存管理 文件系统 进程描述符task_struct数据结构 task _ struct:为了管理进程,内核必须对每个进程进行清晰 ...
- Linux内核设计第七周 ——可执行程序的装载
Linux内核设计第七周 ——可执行程序的装载 第一部分 知识点总结 一.预处理.编译.链接和目标文件的格式 1.可执行程序是怎么得来的 编译链接的过程 预处理阶段 gcc -E -o XX.cpp ...
- 20135327郭皓——Linux内核分析第二周 操作系统是如何工作的
操作系统是如何工作的 上章重点回顾: 计算机是如何工作的?(总结)——三个法宝 存储程序计算机工作模型,计算机系统最最基础性的逻辑结构: 函数调用堆栈,高级语言得以运行的基础,只有机器语言和汇编语言的 ...
随机推荐
- 命令行方式安装Pycharm
sudo apt install snapd snapd-xdg-open snap refresh sudo snap install pycharm-professional --classic
- [转]mysql和redis的区别
转自https://www.cnblogs.com/zxh1297/p/9394108.html 1.mysql和redis的数据库类型 mysql是关系型数据库,主要用于存放持久化数据,将数据存储在 ...
- EasyUI tabs指定要显示的tab
<div id="DivBox" class="easyui-tabs" style="width: 100%; height: 100%;& ...
- 今天遇到一件开心事,在eclipse编写的代码在命令窗口中编译后无法运行,提示 “错误: 找不到或无法加载主类”
java中带package和不带package的编译运行方式是不同的. 首先来了解一下package的概念:简单定义为,package是一个为了方便管理组织java文件的目录结构,并防止不同java文 ...
- 简单规划dp sumsets
Farmer John commanded his cows to search for different sets of numbers that sum to a given number. T ...
- E - Matrix Power Series (矩阵数列)
然后,怎么来求这个前k项的和,我把式子推一下 当k为奇数的时候直接SK-1+AK 就又化为偶数的情况了.代码如下: #include<iostream> #include<cstr ...
- PCB (4)原理图导入PCB
1导入原理图 打开原理图 之后出现对话框,检查错误,选择更新 2 自动对齐 2布线 手动布线 半自动布线 自动布线 输出
- M100 X3云台安装
http://bbs.dji.com/thread-38587-1-1.html
- 在web.xml中通过contextConfigLocation配置spring
<context-param> <param-name>contextConfigLocation</param-name> < ...
- 项目Alpha冲刺 3
作业描述 课程: 软件工程1916|W(福州大学) 作业要求: 项目Alpha冲刺(团队) 团队名称: 火鸡堂 作业目标: 介绍第三天冲刺的项目进展.问题困难和心得体会 1.团队信息 队名:火鸡堂 队 ...