泰晓科技 -- 聚焦 Linux - 追本溯源,见微知著!
网站地址:https://tinylab.org

泰晓RISC-V实验箱,转战RISC-V,开箱即用
请稍侯

订阅 「360° 剖析 Linux ELF」视频课,送年度 Linux 知识星球会员


Linux 进阶必修,Bug 洞察必备,下班准点神器,加薪必带锦囊
Wu Zhangjin 创作于 2019/08/20

By Falcon of TinyLab.org Jan 23, 2021

课程背景

2019 年底,泰晓科技推出首个视频课程 —— 「360° 剖析 Linux ELF」

一年多来,该课程得到了广大 Linux 程序员的支持,为了更好地推广和普及该课程,近日,重新编排了课程并计划持续更新迭代。

经过数周的准备,重新编排后的课程发布到了 “泰晓学院”,“泰晓学院” 将作为社区后续视频课程的主要发布平台。

目前已经在上面发布了一套免费的公开课和一套收费课程,新的课程也在规划中,欢迎大家收藏和关注。

课程信息

  • 课程简介

    该课以 Linux 程序格式 ELF 切入,通过剖析它把各个知识点串起来,通过工具切切实实观察程序编译和运行背后的机理,进而建立起完整的知识体系,做到知其然,也知其所以然。

    课程以该问题开启:同样是打印一个 ‘hello’ 字符串,gcc 8.3 默认生成的 a.out 有 8.3k,而裁剪到 45 字节也能实现同样功能,这 185 倍的差距是什么?

    课程视频累计 8 章 55 节,提供 80+ 份实验材料和专属代码仓库,送多套 PDF 资料(作者撰写的《C语言编程透视》和《ELF 文章合集》及作者整理的 25+ 份 ELF 标准文档),另外,新增内容正在规划中。

  • 课程讲师

    吴章金,泰晓科技技术社区创始人,Linux 官方社区贡献者,15 年 Linux 码农,前魅族内核团队技术总监。热门开源书《C 语言编程透视》作者,Linux 平台下最小 HelloWorld ELF 程序作者。

  • 开课时间

    重新编排的课程已于 2021 年 1 月 19 日上线。

  • 报名方式

    PC可点击访问:https://www.cctalk.com/m/group/88089283

    手机扫码即可:360 ELF 报名二维码

  • 详细详情

    本课程从 ELF 规范入手,从 X86 体系结构和指令集、X86 Linux AT&T 汇编,到代码预处理、编译、汇编、链接及 ELF 可执行文件的生成;再围绕 ELF 可执行文件的装载与运行,由浅入深地讲解程序加载、上下文传递、系统调用、内存布局、进程调度、代码调试以及程序退出全过程。

    在这个过程中,逐步讲解各知识点,并根据各知识点渐进地动手把一个 8.3k 的程序逐步瘦身到 45 个字节。通过动手实践,不仅可以掌握各种常用开发与调试工具,而且能够加深对各知识点的透彻理解。

    本课程既可以顺序学习整体提升对程序开发过程的理解,也可以针对具体问题学习具体章节。每章都有配套作业,可以在课程微信群讨论,多位 Linux 技术专家长期驻群答疑。

    学习本课程,一方面可以解决自己工作中遇到的具体编程问题,另一方面可以打造自下而上的完整技能体系,在专业层级(Title & Salary)上有一个质的跃升。

    本课程采用 Linux Lab 进行实验,只需一台支持 Docker 的 PC 或者笔记本,即可完成本课程所有实验。

课程大纲

  1. 开篇:古有 “庖丁解牛”,今有 “码农剖 ELF”
    • 历史典故:庖丁解牛
      • 目无全牛:“三年之后,未尝见全牛也。……依乎天理,批大郤,导大窾,因其固然。”
      • 得心应手:“臣以神遇而不以目视,官知止而神欲行。”
      • 游刃有余:“以无厚入有间,恢恢乎其于游刃必有余地矣。”
      • 娴熟合律:“……莫不中音。合于桑林之舞,乃中经首之会。”
    • ELF 剖析:“Hello World!”
      • 8.3K v.s 45B
      • 185 倍差距背后隐藏了哪些不为人知的秘密
    • Linux Lab 实验环境准备
      • 简介、安装、演示
    • 实验作业
      • 下载并安装 Linux Lab 实验环境
      • 用 vim 编写 hello.c 并用 gcc 编译、运行
  2. ELF 是什么?
    • Linux 支持哪些可执行文件格式
      • ELF:标准可执行文件格式,25 年历史
      • 跨系统运行 Windows、MacOSX 程序
      • X86 跨架构跑 ARM、MIPS、Risc-V 二进制程序
      • 其他可执行文件类型:Java、Python、Shell
    • 可执行文件格式的演进历史
      • a.out, coff, ELF 演进变迁
    • 各大操作系统都在用什么格式
      • Windows: PE
      • MacOSX: MacO
    • 实验作业
      • 在 Linux 下运行 Windows 程序
      • 在 X86 Linux 下运行 ARM 程序
      • 把上节编写的 hello.c 编译成 a.out 格式并与 ELF 比较
      • 进阶:在 Linux 下运行 MacOSX 程序
  3. Hello 可执行文件可以有多小?
    • Linux 下默认编译的 Hello.c 有多大?
      • 初步分析 8.3K ELF 由哪几部分构成
    • 各大平台上的二进制 Hello 可执行文件做到了多小?
      • Windows PE:97 字节
      • MacOSX MacO:164 字节
      • Linux ELF:45 字节
    • 大家都做了哪些尝试?
      • 编译器优化
      • 手工编译和链接
      • 动手写汇编
      • 用系统调用取代库函数
      • 删掉不用的节区
      • 手工编辑二进制文件
      • 手工构造可执行文件
    • 实验作业
      • 为 hello.c 写一个 Makefile 并灵活调整 GCC 编译选项
      • 尝试运用您掌握的方法裁剪这个 hello 程序
      • 进阶:试试一个更快更小的 C 语言编译器 tinycc
  4. 基础知识筹备
    • ELF 文件格式简介
      • 一起读 ELF 1.2 规范
      • Executables, Objects, Shared libraries, Core dumps
    • C 语言标准与函数调用规范
      • 标准:c89, c99, c11, gnu extensions
      • 函数调用规范:cdecl, fastcall, pascal
      • 静态检查:-Wall, -Werror, -Wpedantic
    • X86 体系结构知识
      • 对齐
      • 大小端
    • X86 AT&T 汇编语言
      • 指令集简介
      • 内联汇编怎么用
      • 自动生成第一个汇编语言程序
    • ELF 工具套装介绍
      • gcc, gdb, cpp, as, ld, ldd, ld.so
      • binutils: readelf, objdump, objcopy, strip
      • elfutils, ELF Kickers
      • hexdump, dd
      • gprof, gcov, perf
    • 实验作业
      • 用本节掌握的方法进一步裁剪 hello 程序
      • 生成一份干净可阅读的汇编代码
      • 用内联汇编读取某个寄存器
      • 写一个程序完成大小端转换
      • 查看某个程序用到了哪些共享库
      • 给定有多个错误的某程序,用上述工具编译、运行、反汇编、调试
      • 进阶:动手写一个 myreadelf
  5. ELF 程序的生成
    • 代码编译与编译器优化
      • 编译过程揭秘:预处理、编译、汇编与链接
      • 编译器基础优化:-O2, -Os
      • 编译器进阶优化:gc-sections, branch-probabilities,lto
    • 静态链接和默认链接行为
      • GCC 默认链接参数详解
      • 探索 C 语言真正的入口
      • 默认链接脚本
    • 共享库和动态链接
      • 符号重定位:plt, got
      • 隐式使用 v.s 显式使用
      • preload: libs live patching
      • prelink: 事先链接取代运行时链接
    • 汇编语言版 Hello
      • 动手写第 1 个汇编语言程序:hello.s
    • 实验作业
      • 用本节掌握的方法进一步裁剪 hello 程序
      • 7 大架构 hello 汇编一块学
      • 无论输出到哪里,都允许 ls 输出带颜色
      • 编译一个内核,删除所有用不到的变量和函数
      • 修改内核 Makefile,禁止打开编译器优化
      • 进阶:动手写一个动态链接工具
  6. ELF 程序的执行
    • 操作系统启动过程简介
      • 盘古开天辟地: 从电脑开机到第 1 个进程的诞生
      • 道生一,一生万物:pstree
      • 第 1 个可交互命令行程序的启动:Shell
    • 按键触发程序执行的那一刻
      • “程序” 有哪些类型
      • 键入一串字符并按下回车之后系统发生了什么?
      • 那些特殊的符号是如何解析的:|, >, <, &
      • env, ltrace, strace
    • 命令行参数和环境变量
      • 上下文传递
      • 用 gdb 观察
      • /proc/{comm, cmdline, environ}
    • 系统调用 Fork & Exec
      • 程序变进程的魔法
    • 实验作业
      • 用本节掌握的方法进一步裁剪 hello 程序
      • 女娲造人:写1个程序并作为 Linux 系统的第1个进程启动
      • 进阶:动手写一个简单的 Shell
  7. ELF 程序的运行与退出
    • ELF 程序加载
      • 内核 load_binary 解读
    • 进程的内存布局
      • 内核 do_mmap 解读
      • 从程序内部、外部分析内存布局
    • 进程的运行和退出
      • 内核 start_thread 解读
      • 进程的运行和消亡
    • 进程跟踪和调试原理
      • 用 gdb 跟踪和调试程序
      • 内核 ptrace 解读
    • 实验作业
      • 用本节掌握的方法进一步裁剪 hello 程序
      • 写一个程序,在程序内部监控代码段是否被篡改
      • 在 498 行极小 OS 上装载、解析并运行标准 ELF 程序
      • 进阶:在 Linux 0.11 增加 ELF 支持
      • 进阶:设计一个可执行文件格式并添加 Linux 内核支持
  8. 结语:像一个外科手术专家那样
    • 把程序比作外科医生的病人,码农就是程序的医生
    • 像专业的外科医生那样熟悉程序组织结构和运行机理
      • 熟练掌握 ELF 生成、执行和运行
      • 做到:目无全牛,游刃有余,“依乎天理……因其固然”
    • 像敬业的外科医生那样给程序看病
      • 沉着冷静地 Debugging
      • 做到:得心应手,踌躇满志,“以神遇而不以目视,官知止而神欲行”
  9. 参考书目一览
    • 《庄子集解》
    • 《C 语言编程透视》
    • 《程序员的自我修养 —— 链接、装载与运行》
    • 《Hacking Hello World》
    • 《深入理解 Linux 内核》
    • 《深入 Linux 内核架构》
    • 《X86/X64 体系探索及编程》
    • 《ARM 嵌入式系统开发 —— 软件设计与优化》
    • 《MIPS 体系结构透视》
    • 《Linux 内核完全注释 —— 基于 0.11 内核》

报名方式

领优惠券

关注 “泰晓科技” 公众号并转发下述文案到朋友圈之后,可联系微信号 tinylab 申请课程优惠券。



Read Related:

Read Latest: