[置顶] 泰晓 RISC-V 实验箱,配套 30+ 讲嵌入式 Linux 系统开发公开课
订阅 「360° 剖析 Linux ELF」视频课,送年度 Linux 知识星球会员
Linux 进阶必修,Bug 洞察必备,下班准点神器,加薪必带锦囊
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
手机扫码即可:
详细详情
本课程从 ELF 规范入手,从 X86 体系结构和指令集、X86 Linux AT&T 汇编,到代码预处理、编译、汇编、链接及 ELF 可执行文件的生成;再围绕 ELF 可执行文件的装载与运行,由浅入深地讲解程序加载、上下文传递、系统调用、内存布局、进程调度、代码调试以及程序退出全过程。
在这个过程中,逐步讲解各知识点,并根据各知识点渐进地动手把一个 8.3k 的程序逐步瘦身到 45 个字节。通过动手实践,不仅可以掌握各种常用开发与调试工具,而且能够加深对各知识点的透彻理解。
本课程既可以顺序学习整体提升对程序开发过程的理解,也可以针对具体问题学习具体章节。每章都有配套作业,可以在课程微信群讨论,多位 Linux 技术专家长期驻群答疑。
学习本课程,一方面可以解决自己工作中遇到的具体编程问题,另一方面可以打造自下而上的完整技能体系,在专业层级(Title & Salary)上有一个质的跃升。
本课程采用 Linux Lab 进行实验,只需一台支持 Docker 的 PC 或者笔记本,即可完成本课程所有实验。
课程大纲
- 开篇:古有 “庖丁解牛”,今有 “码农剖 ELF”
- 历史典故:庖丁解牛
- 目无全牛:“三年之后,未尝见全牛也。……依乎天理,批大郤,导大窾,因其固然。”
- 得心应手:“臣以神遇而不以目视,官知止而神欲行。”
- 游刃有余:“以无厚入有间,恢恢乎其于游刃必有余地矣。”
- 娴熟合律:“……莫不中音。合于桑林之舞,乃中经首之会。”
- ELF 剖析:“Hello World!”
- 8.3K v.s 45B
- 185 倍差距背后隐藏了哪些不为人知的秘密
- Linux Lab 实验环境准备
- 简介、安装、演示
- 实验作业
- 下载并安装 Linux Lab 实验环境
- 用 vim 编写 hello.c 并用 gcc 编译、运行
- 历史典故:庖丁解牛
- 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 程序
- Linux 支持哪些可执行文件格式
- Hello 可执行文件可以有多小?
- Linux 下默认编译的 Hello.c 有多大?
- 初步分析 8.3K ELF 由哪几部分构成
- 各大平台上的二进制 Hello 可执行文件做到了多小?
- Windows PE:97 字节
- MacOSX MacO:164 字节
- Linux ELF:45 字节
- 大家都做了哪些尝试?
- 编译器优化
- 手工编译和链接
- 动手写汇编
- 用系统调用取代库函数
- 删掉不用的节区
- 手工编辑二进制文件
- 手工构造可执行文件
- 实验作业
- 为 hello.c 写一个 Makefile 并灵活调整 GCC 编译选项
- 尝试运用您掌握的方法裁剪这个 hello 程序
- 进阶:试试一个更快更小的 C 语言编译器 tinycc
- Linux 下默认编译的 Hello.c 有多大?
- 基础知识筹备
- 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
- ELF 文件格式简介
- 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,禁止打开编译器优化
- 进阶:动手写一个动态链接工具
- 代码编译与编译器优化
- ELF 程序的执行
- 操作系统启动过程简介
- 盘古开天辟地: 从电脑开机到第 1 个进程的诞生
- 道生一,一生万物:pstree
- 第 1 个可交互命令行程序的启动:Shell
- 按键触发程序执行的那一刻
- “程序” 有哪些类型
- 键入一串字符并按下回车之后系统发生了什么?
- 那些特殊的符号是如何解析的:
|, >, <, &
- env, ltrace, strace
- 命令行参数和环境变量
- 上下文传递
- 用 gdb 观察
- /proc/{comm, cmdline, environ}
- 系统调用 Fork & Exec
- 程序变进程的魔法
- 实验作业
- 用本节掌握的方法进一步裁剪 hello 程序
- 女娲造人:写1个程序并作为 Linux 系统的第1个进程启动
- 进阶:动手写一个简单的 Shell
- 操作系统启动过程简介
- ELF 程序的运行与退出
- ELF 程序加载
- 内核
load_binary
解读
- 内核
- 进程的内存布局
- 内核
do_mmap
解读 - 从程序内部、外部分析内存布局
- 内核
- 进程的运行和退出
- 内核
start_thread
解读 - 进程的运行和消亡
- 内核
- 进程跟踪和调试原理
- 用 gdb 跟踪和调试程序
- 内核
ptrace
解读
- 实验作业
- 用本节掌握的方法进一步裁剪 hello 程序
- 写一个程序,在程序内部监控代码段是否被篡改
- 在 498 行极小 OS 上装载、解析并运行标准 ELF 程序
- 进阶:在 Linux 0.11 增加 ELF 支持
- 进阶:设计一个可执行文件格式并添加 Linux 内核支持
- ELF 程序加载
- 结语:像一个外科手术专家那样
- 把程序比作外科医生的病人,码农就是程序的医生
- 像专业的外科医生那样熟悉程序组织结构和运行机理
- 熟练掌握 ELF 生成、执行和运行
- 做到:目无全牛,游刃有余,“依乎天理……因其固然”
- 像敬业的外科医生那样给程序看病
- 沉着冷静地 Debugging
- 做到:得心应手,踌躇满志,“以神遇而不以目视,官知止而神欲行”
- 参考书目一览
- 《庄子集解》
- 《C 语言编程透视》
- 《程序员的自我修养 —— 链接、装载与运行》
- 《Hacking Hello World》
- 《深入理解 Linux 内核》
- 《深入 Linux 内核架构》
- 《X86/X64 体系探索及编程》
- 《ARM 嵌入式系统开发 —— 软件设计与优化》
- 《MIPS 体系结构透视》
- 《Linux 内核完全注释 —— 基于 0.11 内核》
报名方式
手机扫码报名:扫描下述文案中的二维码即可报名。
领优惠券
关注 “泰晓科技” 公众号并转发下述文案到朋友圈之后,可联系微信号 tinylab 申请课程优惠券。
猜你喜欢:
- 我要投稿:发表原创技术文章,收获福利、挚友与行业影响力
- 知识星球:独家 Linux 实战经验与技巧,订阅「Linux知识星球」
- 视频频道:泰晓学院,B 站,发布各类 Linux 视频课
- 开源小店:欢迎光临泰晓科技自营店,购物支持泰晓原创
- 技术交流:Linux 用户技术交流微信群,联系微信号:tinylab
支付宝打赏 ¥9.68元 | 微信打赏 ¥9.68元 | |
请作者喝杯咖啡吧 |