早鸟报名:《360° 剖析 Linux ELF》在线课程

本课程通过一个最小的点,带动一个知识面的片。围绕Hello ELF裁剪,从Linux等主流操作系统的可执⾏⽂件格式、 ELF规范、体系结构和指令集到代码编译、静态链接、共享库、动态链接、系统调⽤、程序执⾏到程序装载、程序运⾏、内存分布及程序退出。全程⼜会根据各个章节需要对各类ELF分析、裁剪和编辑⼯具进⾏⽤法详解。

指导老师:

吴章⾦ / 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 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 翻译 等

上课式:


在线视频另设1个微信群讨论。

开课时间:


2019年10月19日晚开始

内容列表:

大纲

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

报名方法与价格

价格:


原价759元, 现在报名享受160元早鸟现金优惠,优惠即将结束!

报名输入阅码场专属折扣码YM9C还可再优惠10元。

点击链接一键试看:


 点击观看 选择“课程章节”之免费体验章节

报名方式:


安卓用户可通过微信小程序一键报名:    

 点击报名

IPhone和PC用户:


电脑IE、Firefox、Chrome等浏览器访问www.yomocode.com网站,点击网站右上角的图标,微信扫码登录。

之后点击虚拟化课程进入https://www.yomocode.com/courses/9,扫码报名。

报名结束后,扫码加客服微信,进入答疑群。

猜你喜欢

转载自blog.csdn.net/juS3Ve/article/details/101950472