这门课讲的是 Linux 下程序从源代码变成可执行文件、再被系统加载运行的全过程。它不教语法,也不讲 shell 脚本,而是围绕 ELF 文件格式展开:静态链接时符号怎么解析、地址怎么分配;动态链接时共享库怎么被找到、重定位怎么完成;程序启动时内核做了什么、入口点在哪里;以及内核模块这种特殊 ELF 文件又是怎么被装载和执行的。如果你平时写代码能跑,但遇到段错误、链接报错、库版本冲突时只会复制粘贴,或者想搞清楚 ld、ldd、objdump 这些工具到底在干什么,这门课能补上这块空白。

适合什么基础,建议先看哪几块

需要的基础不多:会写 C 语言,能编译出可执行文件,对 Linux 命令行不陌生就行。不需要提前读过链接器源码,也不需要懂汇编,但最好对内存地址、栈和堆有个模糊概念。课程前几节从 ELF 文件头部和节区结构讲起,节奏不快,跟着看能建立整体认识。如果你完全没接触过链接过程,建议先看“ELF 文件内容与静态链接”和“ELF 文件装载”这两块,它们把最核心的“文件怎么变成进程”讲清楚了。动态链接和程序执行可以放在第二遍再看,因为前者涉及复杂的重定位规则,后者涉及内核的加载流程,需要前面打底。

学完能独立做什么,资料怎么配合练习

学完这门课,你能独立做的事情很具体:用 readelf 和 objdump 分析一个二进制文件的段、符号表和重定位信息;手工编译和链接一个多文件项目时,能解释链接器报错的原因,并知道用 -static、-shared、-Wl,-rpath 这些参数去控制链接行为;遇到“找不到共享库”或“符号版本不匹配”时,能顺着 ELF 的依赖关系找到问题点;理解程序入口(比如 _start)和内核 execve 之间的衔接,知道为什么有的程序能跑、有的程序一启动就崩。如果对内核模块感兴趣,最后那节关于模块装载的内容也能让你明白 insmod 背后发生了什么。

资料里每节都配了时长,建议不要只看视频。先带着问题看一节,然后立刻打开终端,拿一个自己编译的简单程序对照着做实验:查看它的 ELF 头,反汇编入口函数,尝试用 ld 手动链接一个目标文件,观察动态链接前后的 ldd 输出差异。每学完一块,就试着用文字向自己解释一遍“这个环节为什么要这么做”,能讲清楚才算真的会了。如果某节内容一时理解不了,先跳过,不影响后面大框架,回头再补。这门课没有花哨的案例,但每一个知识点都对应着实际排障时能用上的底层事实,值得边看边动手。

课程目录

课程目录5 集
  • 1 ELF file内容、静态链接 (21:13).mp4
  • 2 ELF文件装载 (26:06).mp4
  • 3 动态链接 (20:27).mp4
  • 4 应用程序的执行 (26:11).mp4
  • 5 程序的入口、内核module的装载与执行、杂项 (27:12).mp4