泰晓科技 -- 聚焦 Linux - 追本溯源,见微知著!
网站地址:http://tinylab.org
微信公众号关注我们知识星球
关注 @泰晓科技

与数百位一线 Linux 工程师做朋友,您准备好了吗?
周一到周五,天天有新文。529 页合集等着领!

开课啦:Linux 码农 5 万月薪必修课!
请稍侯

码农自我修养之「ELF 剖析」火热报名中

Wu Zhangjin 创作于 2019/08/20

微信公众号知识星球
关注 @泰晓科技

与数百位一线 Linux 工程师做朋友,您准备好了吗?
周一到周五,天天有新文。529 页合集等着领!

By Falcon of TinyLab.org Aug 20, 2019

课程序言

课程序言

课程简介

近日,泰晓科技 与 阅码场 强强联合,首度推出码农自我修养之 「360° 剖析 Linux ELF」 在线视频课程。

  • 课程讲师

    吴章金,十年 Linux 研发经验,Linux Committer,前魅族内核团队技术总监。热门开源书《C 语言编程透视》作者。

  • 开课时间

    课程视频将于 2019年10月19 日正式上线。

  • 报名方式

    用 PC 浏览器访问下方地址,进去后点开右上角图标用微信扫码登陆。点击 报名方式 获得详细报名步骤。

    http://yomocode.com/courses/9

  • 优惠与折扣

    早鸟优惠价 ¥599,原价 ¥759

    使用专属折扣码(W26F)另享 ¥10 优惠。

    专属折扣码一直有效

阅读下文可进一步了解课程详情。

课程背景

关于 “阅码场” 平台

阅码场平台提供优质的课程,全部都由业界拥有 10 年以上工作经验的一线资深工程师开课,强调内容能直接用于工程实战而不是泛泛而谈。

关于 “ELF 剖析” 课程

作为嵌入式软件工程师,对于一些非常基础的知识点,有没有经常觉得似懂非懂,似是而非呢?

很多知识点,好像以前都学过,但是去分析和解决实际问题的时候,经常碰到:

  • C 语言程序的入口是 main 函数,真的是这样吗?
  • main 函数末尾必须加 return 0 吗,为什么?
  • GCC 默认生成的 a.out 是 a.out 格式吗?
  • Heap 与 Stack, Bss 与 Data 傻傻分不清!
  • 碰到 Segmentation Fault, Stack Overflow 常常不知所措;
  • 缓冲区注入攻击是什么东东,如何检测缓冲区溢出?
  • 偶尔要用到 Linux AT&T 汇编语言或者内联汇编,怎么写,怎么学?
  • 如果要让一个共享库可执行,可以做到吗?
  • 如果无法获得共享库的源码,如何单独升级其中的库函数呢?
  • 公司要做一个只有 8M 闪存的产品,如何下手?
  • 要改变程序代码段的装载地址,该怎么做……

遇到这些问题不用灰心丧气,让我们一起来补补功课;那些曾经模棱两可的知识点,让我们以「实验」的方式都动手观察一遍,把那些模糊不清的地带摸清楚。

ELF 是 Linux 平台上最常用的一种可执行文件格式,它牵涉到程序的前世今生,所以通过剖析它,就可以把各个知识点串起来,通过工具切切实实观察程序编译和运行背后的机理,进而建立起完整的知识体系,做到知其然,也知其所以然。

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

$ gcc --version | head -1
gcc (Ubuntu 8.3.0-16ubuntu3~16.04) 8.3.0
$ echo -ne '#include <stdio.h>\n int main(void) { printf("hello\\n"); return 0; }' | gcc -x c - -
$ ./a.out
hello
$ wc -c a.out  # ~8.3k
8400

$ as --32 -o hello.o hello.s
$ ld -melf_i386 --oformat=binary -o hello hello.o
$ PATH=./:$PWD hello 0 0 0
hello
$ wc -c hello
45

本课程从 ELF 规范入手,从 X86 体系结构和指令集、X86 Linux AT&T 汇编,到代码预处理、编译、汇编、链接及 ELF 可执行文件的生成;再围绕 ELF 可执行文件的装载与运行,由浅入深地讲解程序加载、上下文传递、系统调用、内存布局、进程调度、代码调试以及程序退出全过程。在这个过程中,逐步讲解各知识点,并根据各知识点渐进地动手把一个 8.3k 的程序逐步瘦身到 45 个字节。通过动手实践,不仅可以掌握各种常用开发与调试工具,而且能够加深对各知识点的透彻理解。

本课程既可以顺序学习整体提升你对程序开发过程的理解,也可以针对具体问题学习具体章节。每章都有配套作业,可以在课程微信群讨论,多位 Linux 技术专家长期驻群答疑。学习本课程,一方面可以解决自己工作中遇到的具体编程问题,另一方面可以打造自下而上的完整技能体系,在专业层级(Title & Salary)上有一个质的跃升。

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

指导老师

吴章金 / Falcon

十三年 Linux 系统使用经验,十年 Linux 内核研发经验,六年 Linux 团队管理经验。

重度开源践行者,Linux 官方社区贡献者,前魅族 Linux 内核团队(暨BSP部)技术总监。

  • 2006 年参与创建兰大开源社区,2007 年负责组建正式的校园社团,并陆续支持直到 2010 年研究生毕业。

  • 2009 年到龙芯梦兰实习,在两周内完成首版龙芯实时操作系统(Linux Preempt RT)的移植,同年,为 MIPS 平台开发了 Ftrace、内核压缩等支持,全面整理了龙芯 2 系所有设备的 Linux 内核,并陆续成功往官方社区提交。2010 年发起 Linux Loongson Community (LLC)项目,持续免费维护到 2012 年底,RSM 是 LLC 用户之一。2010 年被提名参加当年 Linux 内核峰会。

  • 2010 年加入 WindRiver,从事 MIPS 平台 BSP 以及 Preempt RT, Ftrace 等 Features 研发。同年,筹备面向一线 Linux 工程师的公益性技术交流平台:泰晓科技。

  • 2011 年加入魅族,从零开始组建系统优化团队,在业界率先思考体系化地解决系统稳定性、功耗、性能、发热等问题,协调研发、测试、生产、售后、流程管理等多个维度构建完整的系统核心体验保障体系。先后参与或者带领团队完成 20 多款手机系统底层软件的研发,总体规模达到数千万台。

在德累斯顿、珠海、北京和上海多次发表技术演讲,数年来,在泰晓科技公开发表了接近 200 篇技术文章,发起并维护了数个开源软件项目,撰写了多份论文和书籍,主要有:

  • 2008/2015: 《C 语言编程透视》、《Shell 编程范例》

  • 2009 RTLWS11: Porting RT-Preempt to Loongson2F

  • 2011 RTLWS13: Tiny Linux Kernel Project: Section Garbage Collection Patchset

  • 2013 ZhuhaiGDG: Android Linux 可靠性(RAS)研究与实践

  • 2013 Packtpub: 《Instant Optimizing Embedded Systems Using BusyBox》

  • 2015 CSDN MDCC 2015:智能手机系统优化的演进与实践

  • 2016 CLK2016: Ftrace 实现原理与开发实践

  • 2006~2019 开源项目

    • MIPS Ftrace
    • MIPS Preempt-RT
    • TinyLinux
    • Linux Lab
    • Linux 0.11 Lab
    • CS630 Qemu Lab
    • VnstatSVG
    • Linux Loongson Community
    • elinux.org 翻译等

欢迎阅读 细数我与 Linux 这十三年 进一步了解讲师。

这里 有讲师之前陆续发表的 200 多篇技术文章汇总。

内容大纲

  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 内核》

报名方式

报名步骤如下:

  1. 访问“阅码场”平台

    打开 PC 浏览器,输入“阅码场”域名:http://www.yomocode.com

  2. 用微信扫码登陆

    点击“阅码场”首页右上角的图标会弹出一个二维码,用手机微信扫描后即可登陆

  3. 进入「360° 剖析 Linux ELF」课程页面

    点击“阅码场”首页左下角的该课程封面,或者直接在浏览器输入课程地址:http://www.yomocode.com/courses/9

  4. 输入专属折扣码

    点击 “输入折扣码,获取额外折扣” 后会看到一个蓝色方框,在框内输入专属折扣码:W26F,使用该折扣码享受 10¥ 优惠。

  5. 支付报名费用

    最后,根据自身方便点击 “使用微信扫码支付” 或 “支付宝扫码支付”。

    早鸟优惠价 ¥599¥,原价 ¥759

    使用专属折扣码(W26F)另享 ¥10 优惠。

    专属折扣码一直有效

  6. 联系客服

    报名后,扫描 “阅码场” 报名页右侧的客服微信二维码加好友,客服会将您拉入课程答疑和讨论微信群。

    也可直接扫码加泰晓科技主编微信:

    tinylab wechat

  7. 小福利

    另外,为答谢大家的支持,讲师特别赠送一个小福利:持该课程购买凭证,加 9.9¥ 可订阅原价 199¥ 的『Linux 知识星球』会员。

Read Related:

Read Latest: