可执行文件
可执行文件
可执行文件
什么是可执行文件?
学习操作系统前
那个 “双击可以弹出窗口的东西”
学习操作系统后
一个操作系统中的对象 (文件)
一个字节序列 (我们可以把它当字符串编辑)
一个描述了状态机初始状态的
数据结构
(打扰了)
可执行文件
ELF: Executable and Linkable Format
我们在《计算机系统基础》中学到的
binutils
中的工具可以让我们查看其中的重要信息
《计算机系统基础》常备工具
readelf & objdump
binutils 里原来还有不少宝藏!
我们在《计算机系统基础》里没学到的
如果我们想了解关于 ELF 文件的信息,有什么不那么 “原始” 的现代工具可用?
哦,有 elfcat,以及更多
可执行文件
可执行文件:字节序列
无论如何,可执行文件都是字节序列
可执行文件
可执行文件:进程初始状态的描述
回顾:
System V ABI
Section 3.4: “Process Initialization”
只规定了部分寄存器和栈
其他状态 (主要是内存) 由
可执行文件
指定
“可执行文件” 需要包含什么?
(今天先假设不依赖 “动态链接库”)
基本信息 (版本、体系结构……)
内存布局 (哪些部分是什么数据)
其他 (调试信息、符号表……)
可执行文件
于是我有了一个想法
可执行文件其实
不需要那么复杂
一个头 (类似 7f 45 4c 46; 这是一个 jg 71)
一段 Trampoline Code (PIC)
操作系统会给一个文件描述符 (指向文件本身)
这段代码直接执行 hardcoded mmap
(就能实现 “加载” 的功能)
剩下的信息都可以用更友好的方式表示
反正是数据结构,一个 json
符号表,调试信息,……