Appearance
concepts/elf/ —— 二进制格式与地址空间
ELF 是"可执行文件/动态库/core dump 到底是什么格式"的答案——性能线的符号解析、崩溃线的 core 分析,本质都在操作 ELF。本目录 10 篇,从格式讲到加载、从地址空间讲到映射。
全局地图见 ../../overview.md;崩溃排查见 ../../crash/;配套工具见 ../../tools/。
核心五篇(理解 ELF 的骨架)
- elf-format.md —— ELF 格式详解:类型(可重定位/可执行/共享库/core)、Header、Section vs Segment、符号表、重定位
- symbol-table.md —— 符号表深度剖析:
Elf64_Sym结构体字段逐字节解码、.symtabvs.dynsym、绑定/类型/可见性、调试工具链(gdb/perf/addr2line)如何使用符号表、符号表与 DWARF 的关系 - compile-link-load.md —— 从源码到运行:编译四阶段(预处理→编译→汇编→链接)、静态链接 vs 动态链接、运行时加载
- memory-layout.md —— 进程内存布局:32/64 位地址空间各段(stack/heap/bss/data/text)、看地址秒判类型、
/proc/pid/maps
Section 专题(逐节深挖)
- text-data-bss.md —— 代码与数据四节:
.text(AX)、.rodata(A)、.data(WA)、.bss(NOBITS)的类型/标志/加载行为,size命令速查 - plt-got.md —— 动态链接基础设施:
.plt(跳板模板)、.got.plt(地址表)、.interp(指定 ld.so)、.dynamic(DT_* 目录)、延迟绑定完整指令级流程、RELRO 安全机制 - relocation.md —— 重定位节:
Elf64_Rela结构体、链接时(.rela.text)vs 加载时(.rela.dyn)vs PLT 延迟绑定(.rela.plt),六种重定位类型的计算公式 - init-fini.md —— 初始化与终止节:
.init/.fini(传统代码段)vs.init_array/.fini_array(现代函数指针数组),.preinit_array、.ctors/.dtors,main前后完整执行顺序 - static-init-order.md —— 全局单例的构造与析构顺序:C++ 全局对象构造/析构的跨 TU 顺序陷阱、glibc
exit()内部调用链(atexit →__cxa_finalize→.fini_array)、Static Initialization Order Fiasco 与工程解决方案(Meyer's Singleton / nifty counter / init_priority 等) - eh-frame.md —— 异常处理帧:
.eh_frame(CIE+FDE 栈展开表)、.eh_frame_hdr(二分查找索引)、.gcc_except_table(try/catch 区域),零成本异常处理与 gdb/perf 栈回溯的全流程 - meta-sections.md —— 元数据与调试辅助节:
.comment(编译器版本)、.note.*(ABI 标签 + Build ID)、.shstrtab(Section 名字字符串池)、.gnu_debuglink(分离符号指针)
二进制约定(ABI)
- c-abi.md —— C ABI(System V AMD64):函数调用在汇编层面的底层规则(参数传递/返回值/栈帧结构/寄存器使用约定/红区/栈对齐/数据类型大小与对齐/系统调用的特殊 ABI)
- c++-abi.md —— C++ ABI(Itanium C++ ABI):名字改编(mangling)、虚表布局与虚函数分发、this 指针、多重继承/虚继承下的 this 调整、零成本异常处理模型(.eh_frame/LSDA/栈展开)、RTTI 与 dynamic_cast 原理、成员函数指针、全局对象/thread_local
映射与内存
- mmap.md —— mmap 接口详解:四象限(文件/匿名 × 私有/共享)、惰性缺页、malloc 大块/加载 .so/共享内存 IPC、mmap vs read/write、调优
- shared-memory.md —— 共享内存:两套接口对比(System V IPC:
shmget/shmatvs POSIX:shm_open/mmap)、本质(多个进程 PTE 指向同一 PFN)、同步方案、观测调试
加载与注入
- library-injection.md —— 用户态动态库注入:LD_PRELOAD/LD_AUDIT、运行期 dlopen、ptrace 注入、/proc/pid/mem 改写、gdb 注入的原理对比与防御三道防线
工具五篇(操作 ELF 的瑞士军刀)
- readelf.md —— 解析 ELF(Header/Sections/Segments/Symbols)
- objdump.md —— 反汇编
- nm.md —— 符号表查看
- ldd.md —— 动态库依赖
- misc.md —— 其他小工具合集(file/size/strings/strip/objcopy 等)
配套:进程创建时的 ELF 加载见 ../process/process-creation.md,崩溃 core 分析见 ../../crash/core-dump.md。
一句话:ELF 是性能线和崩溃线的共同地基——先看 elf-format.md 搞清楚格式,再看 compile-link-load.md 理解怎么跑起来的,最后按需用那五个工具操作 ELF。