报名:《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. 开篇:古有 “庖丁解牛”,今有 “码农剖 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,现价659,输入优惠码YM9C还可再优惠10元。
免费试听预览(20分钟)
安卓手机用户通过微信小程序一键报名:
iphone和PC用户报名方法
电脑IE、Firefox、Chrome等浏览器访问www.yomocode.com网站,点击网站右上角的图标,微信扫码登录。
之后点击ELF课程进入https://www.yomocode.com/courses/9,扫码报名。
除了 8 份幻灯片,20 多份标准和规范,40 多份实验材料以及 10 多个小时的课程视频,课程还全新设计了数十张图表,另有配合实验材料录制了十数个实验演示视频。下面是摘录出来的一张具有代表性的示图。