[size=11.0000pt]段类型 | [size=11.0000pt]功能描述 | [size=11.0000pt]典型内容 | [size=11.0000pt]链接时作用 |
[size=11.0000pt].text | [size=11.0000pt]可执行代码段 | [size=11.0000pt]编译生成的机器指令 | [size=11.0000pt]代码段合并 |
[size=11.0000pt].data | [size=11.0000pt]已初始化全局 / 静态数据 | [size=11.0000pt]如[size=11.0000pt]int global_var=10; | [size=11.0000pt]数据段合并 |
[size=11.0000pt].bss | [size=11.0000pt]未初始化全局 / 静态数据(不占磁盘) | [size=11.0000pt]如[size=11.0000pt]int uninit_var; | [size=11.0000pt]加载时零初始化 |
[size=11.0000pt].rel.text | [size=11.0000pt]代码段重定位信息 | [size=11.0000pt]记录需要重定位的指令位置及类型 | [size=11.0000pt]修正指令中的地址引用 |
[size=11.0000pt]重定位类型 | [size=11.0000pt]实施时机 | [size=11.0000pt]地址计算方式 | [size=11.0000pt]适用场景 | [size=11.0000pt]典型指令修正 |
[size=11.0000pt]绝对重定位 | [size=11.0000pt]链接阶段 | [size=11.0000pt]直接使用绝对物理地址 | [size=11.0000pt]固定地址设备驱动程序 | [size=11.0000pt]修正[size=11.0000pt]JMP 0x1000[size=11.0000pt]中的地址 |
[size=11.0000pt]可重定位重定位 | [size=11.0000pt]链接阶段 | [size=11.0000pt]基于基址的相对地址计算 | [size=11.0000pt]通用可执行文件 | [size=11.0000pt]修正[size=11.0000pt]MOV [R0+offset] |
[size=11.0000pt]动态重定位 | [size=11.0000pt]加载阶段 | [size=11.0000pt]运行时根据内存映射动态调整 | [size=11.0000pt]动态链接库 | [size=11.0000pt]修正 GOT 表中的函数地址 |
[size=11.0000pt]PLT[func] → JMP GOT[func](首次为PLT自身指令)→ 执行动态链接器解析逻辑 → 更新GOT[func]为真实地址 |
[size=11.0000pt]高地址 [size=11.0000pt]├───────────────┤ 内核空间(3GB-4GB) [size=11.0000pt]├───────────────┤ 栈(向下增长,存放局部变量/函数参数) [size=11.0000pt]├───────────────┤ 堆(向上增长,动态内存分配) [size=11.0000pt]├───────────────┤ 共享库映射区(动态链接库加载) [size=11.0000pt]├───────────────┤ 数据段(.data/.bss,全局变量) [size=11.0000pt]├───────────────┤ 代码段(.text,只读可执行) [size=11.0000pt]低地址 |
[size=11.0000pt]特征 | [size=11.0000pt]静态链接 | [size=11.0000pt]动态链接 |
[size=11.0000pt]依赖解决时机 | [size=11.0000pt]编译链接阶段 | [size=11.0000pt]程序加载阶段 |
[size=11.0000pt]可执行文件大小 | [size=11.0000pt]大(包含库代码) | [size=11.0000pt]小(仅记录库引用) |
[size=11.0000pt]升级影响 | [size=11.0000pt]需重新链接 | [size=11.0000pt]库更新后无需重新编译 |
[size=11.0000pt]内存占用 | [size=11.0000pt]多进程独立加载库 | [size=11.0000pt]多进程共享库内存映射 |
[size=11.0000pt]graph TD [size=11.0000pt]A[可执行文件生成] --> B(目标文件格式) [size=11.0000pt]A --> C(链接过程) [size=11.0000pt]B --> B1(ELF段结构) [size=11.0000pt]B --> B2(符号表作用) [size=11.0000pt]C --> C1(符号解析) [size=11.0000pt]C --> C2(重定位) [size=11.0000pt]D[程序加载机制] --> E(内存布局) [size=11.0000pt]D --> F(动态链接) [size=11.0000pt]E --> E1(代码段/数据段) [size=11.0000pt]E --> E2(堆/栈/共享库区) [size=11.0000pt]F --> F1(GOT/PLT机制) [size=11.0000pt]F --> F2(延迟绑定) [size=11.0000pt]G[运行时环境] --> H(地址重定位) [size=11.0000pt]G --> I(ASLR技术) |
[size=11.0000pt]学习阶段 | [size=11.0000pt]核心任务 | [size=11.0000pt]建议用时 | [size=11.0000pt]配套练习 |
[size=11.0000pt]基础夯实 | [size=11.0000pt]掌握 ELF 格式、链接基本步骤 | [size=11.0000pt]3 小时 | [size=11.0000pt]教材 P110 习题 1、2、3 |
[size=11.0000pt]进阶提升 | [size=11.0000pt]动态链接机制、内存布局分析 | [size=11.0000pt]4 小时 | [size=11.0000pt]教材 P111 习题 7、8、9 |
[size=11.0000pt]综合应用 | [size=11.0000pt]分析链接错误、配置 ASLR 影响 | [size=11.0000pt]2 小时 | [size=11.0000pt]模拟题:设计避免符号冲突的链接方案 |
[size=11.0000pt]总结巩固 | [size=11.0000pt]制作段功能速查表、链接流程脑图 | [size=11.0000pt]1.5 小时 | [size=11.0000pt]自测:描述动态链接库的加载全过程 |
欢迎光临 教育改变生活 (http://bbs.goldoar.com/) | Powered by Discuz! X3.2 |