Linux阅码场

文章数:550 被阅读:876928

账号入驻

报名:《360° 剖析 Linux ELF》在线视频课程已经全面上线

2019-11-03
    阅读数:

本课程通过一个最小的点,带动一个知识的面。通过李云龙攻打平安县城这个点切,最终实现抗战全面胜利。

围绕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分钟)

ELF免费试听


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

点击报名 


iphone和PC用户报名方法


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

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



除了 8 份幻灯片20 多份标准和规范40 多份实验材料以及 10 多个小时的课程视频,课程还全新设计了数十张图表,另有配合实验材料录制了十数个实验演示视频下面是摘录出来的一张具有代表性的示图。




About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: TI培训

北京市海淀区知春路23号集成电路设计园量子银座1305 电话:(010)82350740 邮编:100191

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2018 EEWORLD.com.cn, Inc. All rights reserved