可执行程序的装载

作者:20135304刘世鹏

  《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000 

一、预处理、编译、链接和目的文件的格式

1、1可执行程序是怎么得来的

  • C代码经过编译器的预处理编译、编译成汇编代码、编译器将其编译成目标代码、链接成可执行文件。
  • 预处理负责把include的文件包含进来及宏替换等工作。
  • 预处理之后的文件编译成汇编代码。
  • 汇编代码.s编译成.o

1、2目标文件格式的ELF

  • 常见的文件格式:A.out(最古老的)、 COFF 、PE(windows系统)、 ELF(Linux系统)
  • ABI应用程序二进制接口,在目标文件中已经是二进制兼容的格式了,目标文件适应到某一种CPU体系结构
  • ELF格式中主要有3种可执行文件:可重定位文件.o,可执行文件,共享目标文件

  • 一个ELF头在文件的开始,保存了路线图,描述了文件的组织情况
  • 当创建或增加一个进程映像的时候,系统在理论上将拷贝一个文件的段到一个虚拟的内存段

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

  • 可执行文件ELF加载到内存中去:代码的数据加载到内存中去
  • 默认ELF文件加载到0x8048000
  • 程序的实际入口0x8048300(启动一个刚加载过可执行文件之后开始执行的入口点)
  • 一般静态链接会将所有代码放在一个代码段
  • 动态链接的进程会有多个代码段

二、可执行程序、共享库和动态链接

2、1装载可执行程序之前的动作

  • 可执行程序的执行环境:shell命令行、main函数的参数和execve参数
  • shell本身不限制命令行参数的个数,命令行参数的个数受限于命令本身
  • shell会调用execve将命令行参数和环境传递给可执行程序的main函数
  • 命令行参数和环境变量是如何保存和传递的:execve将原来的执行环境覆盖掉了,shell程序——>execve——>sys_execve然后在初始化新程序堆栈时拷贝进去
  • 先函数调用参数传递,再系统调用参数传递

2、2装载动态链接和运行时动态链接应用举例

  • 动态链接分为:可执行程序装载时动态链接和运行时动态链接
  • 准备.so文件——>编译成libshlbexample.so文件(共享库)——>编译成libdllibexample.so文件(动态装载)
  • 编译main:只提供了shellexample的-L和-l,并没有提供dllibexample的相关信息,只指明了-ldl

三、可执行程序的装载

3、1可执行程序的装载相关关键问题分析

  • execve和fork都是特殊的系统的调用,当前程序执行到execve系统调用时陷入到内核态,execve加载可执行文件把当前进程的可执行文件覆盖掉,execve返回新的可执行程序的执行起点。

  • int execve(把命令行和环境参数加载进来)
  • sys_execve内部会解析可执行文件格式:do_execve->do_execve_common->exec_binprm
  • search_binaty_handle符合文件格式,对应的解析模块(根据文件头部信息寻找对应的文件格式处理模块)
  • 对于ELF格式的可执行文件执行的是load_elf_binary

  • elf_format和init_elf_binfnt是观察者模式中的观察者
  • 寻找头文件是被观察者,出现elf格式文件,观察者自动执行elf_format模块
  • execve系统调用返回用户态从哪里开始执行:load_elf_binary->start_thread(通过修改内核堆栈中EIP的值作为新程序的起点)

3、2sys_execve的内部处理过程

  • search_binary_handler(寻找可执行文件的处理函数) fmt->load_binary(加载可执行程序的处理函数)
  • register_binfmt(注册结构体变量)
  • kernal_read读取文件信息
  • ELF可执行文件会被默认映射到0x8048000这个地址
  • 需要动态链接的可执行文件先加载连接器ld这个共享库 load_elf_interp(加载动态连接器的起点)
  • 如果是静态链接直接进入elf_entry,elf_entry是新程序的起点
  • start_thread(如果是静态链接,直接指向main8048000;如果可执行文件是动态链接库,指向动态连接器的起点

3、3使用gdb跟踪sys_execve的内部处理过程

自己实验截图:

(1)克隆,覆盖test.c

test.c文件代码:

(2)生成根文件系统时,将init hello放入rootfs地址中,这样在执行exec文件时,就自动加载hello文件

(二)使用gdb跟踪sys_execve内核函数的处理过程

1、加载符号表,并连接到端口1234

2、设置断点:b sys_execve(可以先停在sys_execve然后再设置其他断点),b load_elf_binary,b start_thread。

3、执行

4、输入c继续执行,输入指令exec,list查看,按s可以跟踪进行到do_execve的内部。

3、4可执行程序的装载与庄生梦蝶的故事

  • 庄周(调用execve的可执行程序)
  • 入睡(调用execve陷入内核)
  • 醒来(系统调用execve返回用户态)
  • 发现自己是蝴蝶(被execve加载的可执行程序)

3、5浅析动态链接的可执行程序装载

  • 动态链接的过程,内核做了什么?动态链接库的依赖会形成一个图
  • ELF格式中的,.interp和.dynamic需要依赖动态链接器来解析

  • entry返回到用户态时不是返回到可执行程序规定的起点,返回到动态链接器的程序入口

  • 装载和链接之后ld将CPU的控制权交给可执行程序

  • 动态链接库的装载过程是一个图的遍历过程

四、总结

1、可执行程序的产生:

C语言代码-->编译器预处理-->编译成汇编代码-->汇编器编译成目标代码-->链接成可执行文件,再由操作系统加载到内存中执行。

2、ELF格式中主要有3种可执行文件:可重定位文件.o,可执行文件,共享目标文件。

3、ELF可执行文件会被默认映射到0x8048000这个地址。

4、命令行参数和环境变量是如何进入新程序的堆栈的?

Shell程序-->execve-->sys_execve,然后在初始化新程序堆栈时拷贝进去。

先函数调用参数传递,再系统调用参数传递。

5、当前程序执行到execve系统调用时陷入内核态,在内核中用execve加载可执行文件,把当前进程的可执行文件覆盖掉,execve系统调用返回到新的可执行程序的起点。

6、动态链接库的装载过程是一个图的遍历过程,

ELF格式中的.interp和.dynamic需要依赖动态链接器来解析,entry返回到用户态时不是返回到可执行程序规定的起点,返回到动态链接器的程序入口。

转载于:https://www.cnblogs.com/L20135304/p/5375698.html

可执行程序的装载——刘世鹏20135304相关推荐

  1. 模块20135304——刘世鹏

    编译生成新内核 一.实践原理 Linux模块是一些可以作为独立程序来编译的函数和数据类型的集合.之所以提供模块机制,是因为Linux本身是一个单内核.单内核由于所有内容都集成在一起,效率很高,但可扩展 ...

  2. 20135304刘世鹏——信息安全系统设计基础第九周总结

    第十章.系统I/O 一个Unix文件就是一个m个字节的序列:B0,B1,-,BK,-,Bm-1 一.unix i/o 596 Unix I/O:一种将设备优雅地映射为文件的方式,允许Unix内核引出一 ...

  3. 20135304刘世鹏——信息安全系统设计基础第一周学习总结

    第一节 Linux系统简介 一.Linux是一个操作系统 1. Linux 本身只是操作系统的内核.内核是使其他程序能够运行的基础. 它实现了多任务和硬件管理,用户或者系统管理员交互运行的所有程序 实 ...

  4. 好久没有看到这么有建设性德文章,由衷地赞叹《知其所以然地学习(以算法学习为例)》-By 刘未鹏(pongba)

    知其所以然地学习(以算法学习为例) By 刘未鹏(pongba) C++的罗浮宫(http://blog.csdn.net/pongba) Updated(2008-7-24):更新见正文部分,有标注 ...

  5. 刘云鹏:大数据,让我离生活更近 | 优秀毕业生专访

    [ 导读 ] 清华-青岛数据科学研究院(以下简称"数据院")自2014年4月成立以来,秉承"学校统筹,问题引导,社科突破,商科优势,工科整合,业界联盟"24字指 ...

  6. 刘未鹏谈如何学习算法

    2019独角兽企业重金招聘Python工程师标准>>> 刘未鹏谈如何学习算法,很有指导意义,特摘录一段于此. 那到底什么样的才算是授人以渔的呢?波利亚的<如何解题>绝对算 ...

  7. 读书笔记2013-1--暗时间(刘未鹏)

    暗时间(刘未鹏)读书笔记 1.过早退出是一切失败的根源 2.兴趣遍地都是,专注和持之以恒才是真正稀缺的 3.反思是改变自己的第一步,我们常常容易发现别人的问题,别人的错误,却难以发现自己思维中的问题, ...

  8. 南水北调真相 林凌刘世庆范晓做客四川新闻网

    南水北调真相 林凌刘世庆范晓做客本网 近段时间,网友对"南水北调"一事相当关注.针对此事,论坛特地请来三位专家,与网友共同关注"南水北调"! 嘉宾简介: 范晓: ...

  9. 刘世锦:引入区块链等相关技术建立政府、企业和个人的绿色责任账户

    十四五规划专家委员会委员.国务院发展研究中心原副主任刘世锦在十四五时期的结构性改革暨<读懂"十四五">专家研讨会上就碳中和目标推动下绿色发展的微观基础发表了看法,他建议 ...

最新文章

  1. IOS开发UISearchBar失去第一响应者身份后,取消按钮不执行点击事件的问题
  2. python红色的颜色表达式_50行Python代码实现视频中物体颜色识别和跟踪(必须以红色为例)...
  3. 关于 Angular 服务实例作用域的问题 - 使用组件限定服务提供者的作用域
  4. python3 image_python3 ImageTk 安装方法
  5. Github中国区Star超过1W的大佬和他们的公众号,太强了!
  6. Jenkins系列-Jenkins插件备份
  7. Games101 计算机图形学课程笔记: Lecture14 Ray Tracing 2
  8. tomcat 查看当前请求数_原生线程池这么强大,Tomcat 为何还需扩展线程池?
  9. mysql error 1837_MySQL 主从复制错误1837
  10. 网管必知:Windows常用网络命令详解
  11. 阿里云注册域名,购买云服务器,备案,域名解析教程
  12. 华为服务器鼠标不响应,华为笔记本电脑鼠标失灵没反应如何解决
  13. Clickhouse优点 缺点 / Doris 优点 缺点
  14. 河南师范大学python+学习笔记6 组合数据类型
  15. word模板动态填充并下载
  16. IntelliJ Save Action
  17. PCAP学习笔记二:pcap4j源码笔记
  18. msp430流水灯c语言程序,MSP430单片机流水灯程序
  19. 2022保育员(初级)考试题库及模拟考试
  20. 〖Python 数据库开发实战 - MySQL篇⑩〗- MySQL 中不同的数据类型

热门文章

  1. 在一个老外微信PM的眼中,中国移动App UI那些事儿
  2. 【文献学习】热电偶信号调理电路
  3. SQL的主键和外键的设置语法
  4. python正则表达式与文本匹配
  5. 台达伺服ASDA-B2调试
  6. 梁继璋:给儿子的一封信
  7. 旅游业如何使用数据分析?
  8. 【算法•日更•第九期】树型动态规划详解:二叉苹果树
  9. 利用Python获取国内某天从某地到某地的所有航班;附在win10系统下安装Python第三方包的方式
  10. Oracle中CHR()函数使用