10. 可执行文件

有了系统调用和 libc,我们就真的可以实现 “任何程序” 了——例如,你可以想一想,如果要实现一个 MicroPython 解释器,我们需要实现什么,又需要借助哪些系统调用?当然,我们需要编译器帮我们编译 python.c 到可执行文件——我们一直以来都 “默认” 了编译器工具链可以帮助我们实现高级语言到可执行文件的翻译。今天是时候 “打开” 这部分内容了。

💬
Prompt: 如果要实现一个 MicroPython 解释器,我们需要实现什么,又需要借助哪些系统调用?

本讲内容:(静态链接) 可执行文件的概念和基本原理;我们如何自己动手构建一个可执行文件格式。

10.1 可执行文件

10.2 和 ELF 搏斗的每一年

10.3 Funny Little Executable

10.4 操作系统和加载器

10.5 总结

Take-away Messages: 可执行文件是一个描述状态机初始状态的数据结构 (字节序列);加载器就是把这个 “初始状态” 搬运到操作系统中的程序。用数据结构的眼光看可执行文件,就不难发现它不好阅读的原因:它的设计者并没有打算让你阅读它。这样的难题在《操作系统》课程中经常出现;而我们的应对方法是先理解一个粗糙但重要的模型,然后在此基础上理解工业级实现面临的挑战和问题。