网络

教育改变生活

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 113|回复: 0
打印 上一主题 下一主题

[计算机系统原理] 《计算机系统原理》(2023 年版)第 4 章 可执行文件的生...

[复制链接]

589

主题

616

帖子

4万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
41773

最佳新人活跃会员热心会员推广达人宣传达人灌水之王突出贡献优秀版主荣誉管理论坛元老

跳转到指定楼层
楼主
发表于 3 天前 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
《计算机系统原理》(2023 年版)第 4 章 可执行文件的生成与加载 学习指南一、章节核心架构
本章聚焦程序从目标代码到内存中运行实例的关键环节,核心内容包括:
1. 可执行文件生成:目标文件格式(ELF)、链接过程(符号解析 / 重定位)、静态链接与动态链接的实现机制
2. 程序加载机制:内存空间分配、地址重定位(静态 / 动态)、符号绑定(全局 / 局部)、动态链接库(DLL / 共享库)的加载原理
3. 运行时环境:程序内存布局(代码段 / 数据段 / / 栈)、入口地址解析、操作系统对加载过程的干预(如 ASLR 地址随机化)
二、学习目标拆解(一)知识掌握目标
1. 准确描述 ELF 目标文件的三种类型( relocatable/executable/shared)及其典型应用(教材 P90 4-1 重点)
2. 熟练区分链接过程的两大核心任务:符号解析与重定位,理解重定位表的作用(P93 4-3
3. 掌握动态链接的关键技术:GOT(全局偏移表)、PLT(过程链接表)、延迟绑定机制(P98-99 核心内容)
4. 清晰阐述程序内存布局的五个主要区域(代码段、数据段、BSS 段、堆、栈)的功能与特性
5. 识别不同链接方式对程序体积、运行效率、依赖管理的影响(如静态链接的可执行文件无需外部库)
(二)能力培养目标
1. 能使用工具分析目标文件结构(如objdump -h查看 ELF 段头,nm查看符号表)
2. 正确解析链接错误信息(如 "undefined reference" 对应符号解析失败,"relocation error" 对应重定位错误)
3. 对比不同加载场景下的内存占用(例:多个进程共享动态链接库时的内存映射机制)
4. 理解地址空间布局随机化(ASLR)对程序安全性的提升原理(通过随机化加载地址对抗缓冲区溢出攻击)
三、重点难点深度解析(一)核心重点模块1. 目标文件格式与链接过程
ELF 文件关键段
[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]修正指令中的地址引用
符号解析规则
局部符号:在目标文件内解决(如静态函数符号)
全局符号:优先解析定义在第一个遇到的目标文件(需避免多重定义)
外部符号:依赖动态链接库时通过ld.so解析(如printf的符号解析)
2. 重定位技术详解
重定位类型对比
[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 表中的函数地址
延迟绑定优化:首次调用动态库函数时才解析其地址(通过 PLT 跳转),减少程序启动时间,典型流程:
[size=11.0000pt]PLT[func] → JMP GOT[func](首次为PLT自身指令)执行动态链接器解析逻辑 更新GOT[func]为真实地址
3. 程序内存布局与加载过程
典型内存布局(32 Linux
[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]低地址
关键:代码段和数据段的加载地址由链接时指定或运行时动态分配(ASLR 控制)
(二)学习难点突破
1. 符号表与符号解析
符号表条目包含:符号名、值(地址)、大小、类型(全局 / 局部 / 外部)、绑定属性(默认GLOBAL可被其他文件访问)
示例:编译a.c引用b.c中的全局变量x,链接时ld会查找b.o的符号表中x的地址并修正a.o中的引用
1. 动态链接库的加载路径
加载顺序:LD_LIBRARY_PATH环境变量 DT_RPATH段(编译时指定)DT_LD_LIBRARY_PATH(慎用)系统库路径(如/lib64
常见问题:版本冲突时通过ldd命令查看可执行文件实际链接的库版本
1. 地址空间布局随机化(ASLR
原理:每次程序加载时,随机化栈、堆、共享库的基地址,增加缓冲区溢出攻击的难度
配置:通过echo 0/1/2设置/proc/sys/kernel/randomize_va_space关闭 / 部分随机 / 完全随机
四、高效学习方法(一)工具驱动学习法
1. ELF 文件分析
使用objdump -x查看目标文件头信息,识别FileType(如EXEC为可执行文件)
通过readelf -s查看符号表,区分LOCAL(静态函数)和GLOBAL(导出函数)符号
1. 链接过程调试
静态链接:gcc -static -o static_prog prog.c,观察文件体积(通常远大于动态链接版本)
动态链接:ldd dynamic_prog查看依赖的共享库,理解libc.so.6等基础库的作用
(二)对比分析法
1. 制作链接方式对比表:
[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]多进程共享库内存映射
1. 内存布局可视化:绘制程序加载到内存后的各段分布,标注代码段(只读)、数据段(可写)、栈(自动管理)的权限差异
(三)错误归因法
针对典型错误:
未定义符号(undefined symbol:检查是否遗漏目标文件链接(如gcc prog.c -lm需显式链接数学库)
重定位错误(relocation out of range:通常因 32 位程序访问超过 4GB 地址空间,或指针类型转换错误导致
五、知识框架与考点聚焦(一)核心知识图谱
[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技术)
(二)高频考点预测
1. ELF 文件主要段的功能(简答题,例:说明.text.data.bss段的区别)
2. 静态链接与动态链接的优缺点(论述题,结合嵌入式系统和大型软件场景分析)
3. 重定位的作用及实现方式(计算题,给出重定位表条目,计算指令修正后的地址)
4. 动态链接中 GOT/PLT 的协作机制(原理题,绘制函数调用时 PLT 跳转流程)
六、备考策略与资源推荐(一)针对性练习建议
1. 目标文件分析:选取教材示例代码,编译生成.o文件后,使用objdump查看段结构和符号表,验证理论知识
2. 链接错误复现:故意编写未定义外部符号的代码(如调用未实现的函数),观察链接器报错信息并分析原因
3. 内存布局绘图:根据教材 P102 4-7,手绘程序内存布局图,标注各段的读写执行权限(如代码段r-x,数据段rw-
(二)深度理解工具
1. 调试工具链:
◦ gdb:通过layout asm观察程序加载后的内存地址,验证重定位是否正确
◦ strace:追踪程序加载时的dlopen/dlsym系统调用,理解动态链接过程
1. 官方文档:阅读 GNU Binutils 手册中关于 ELF 文件格式和链接器的章节,获取权威解释
(三)学习计划建议
[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 习题 123
[size=11.0000pt]进阶提升
[size=11.0000pt]动态链接机制、内存布局分析
[size=11.0000pt]4 小时
[size=11.0000pt]教材 P111 习题 789
[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]自测:描述动态链接库的加载全过程
七、常见问题答疑
Q1:为什么 BSS 段在磁盘文件中不占用空间?ABSS 段存储未初始化的全局 / 静态变量,程序加载时由操作系统自动初始化为零,因此无需在磁盘文件中存储具体数据,仅记录需要分配的内存大小
Q2:动态链接如何实现库文件的版本兼容?A:通过符号版本号(如libc.so.6中的版本信息)和 SONAME(共享对象名称)机制,允许新库兼容旧程序的符号接口,同时提供新功能
Q3:地址重定位为什么需要区分绝对地址和相对地址?A:绝对地址重定位用于固定位置的代码(如 BIOS 固件),而相对地址重定位(基于基址寄存器)允许程序在内存中动态加载,提高内存使用灵活性
通过系统化学习,建议重点关注链接过程中符号解析与重定位的具体实现,以及动态链接如何提升程序的可维护性和内存效率。结合 GNU 工具链的实际操作,将理论知识转化为对可执行文件生成和加载过程的直观理解,为后续学习操作系统内存管理和程序执行原理奠定基础。遇到复杂机制(如 GOT/PLT)时,可通过分步调试观察指令执行流程,确保每个环节的逻辑清晰。

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

WEB前端

QQ|手机版|小黑屋|金桨网|助学堂  咨询请联系站长。

GMT+8, 2025-6-7 01:21 , Processed in 0.035896 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表