可执行文件

可执行文件

2025 南京大学《操作系统原理》
可执行文件

什么是可执行文件?

学习操作系统前

  • 那个 “双击可以弹出窗口的东西”

center

学习操作系统后

  • 一个操作系统中的对象 (文件)
  • 一个字节序列 (我们可以把它当字符串编辑)
  • 一个描述了状态机初始状态的数据结构 (打扰了)
2025 南京大学《操作系统原理》
可执行文件

ELF: Executable and Linkable Format

我们在《计算机系统基础》中学到的

  • binutils 中的工具可以让我们查看其中的重要信息
    • 《计算机系统基础》常备工具
      • readelf & objdump
    • binutils 里原来还有不少宝藏!

我们在《计算机系统基础》里没学到的

  • 如果我们想了解关于 ELF 文件的信息,有什么不那么 “原始” 的现代工具可用?
    • 哦,有 elfcat,以及更多
2025 南京大学《操作系统原理》
可执行文件

可执行文件:字节序列

无论如何,可执行文件都是字节序列

center

2025 南京大学《操作系统原理》
可执行文件

可执行文件:进程初始状态的描述

回顾:System V ABI

  • Section 3.4: “Process Initialization”
    • 只规定了部分寄存器和栈
    • 其他状态 (主要是内存) 由可执行文件指定

“可执行文件” 需要包含什么?

  • (今天先假设不依赖 “动态链接库”)
  • 基本信息 (版本、体系结构……)
  • 内存布局 (哪些部分是什么数据)
  • 其他 (调试信息、符号表……)
2025 南京大学《操作系统原理》
可执行文件

于是我有了一个想法

可执行文件其实不需要那么复杂

  • 一个头 (类似 7f 45 4c 46; 这是一个 jg 71)
  • 一段 Trampoline Code (PIC)
    • 操作系统会给一个文件描述符 (指向文件本身)
    • 这段代码直接执行 hardcoded mmap
  • (就能实现 “加载” 的功能)

剩下的信息都可以用更友好的方式表示

  • 反正是数据结构,一个 json
    • 符号表,调试信息,……
2025 南京大学《操作系统原理》