解读《深入理解计算机系统(CSAPP)》第7章链接

简介: 大多数编译器提供编译器驱动程序(compiler driver),他代表用户在需要时调用语言预处理器、编译器、汇编器和链接器

image.png

前言:📫 作者简介:小明java问道之路,专注于研究计算机底层,就职于金融公司后端高级工程师,擅长交易领域的高安全/可用/并发/性能的设计和架构📫

🏆 Java领域优质创作者、阿里云专家博主、华为云享专家🏆

🔥 如果此文还不错的话,还请👍关注点赞收藏三连支持👍一下博主哦

本文导读

链接是将各种代码和数据片段收集并组合成为一个单一文件的过程,这个文件可被加载到内存并执行。链接可以执行于编译时、加载时或者运行时。链接是由链接器自动执行的。

大多数编译器提供编译器驱动程序(compiler driver),他代表用户在需要时调用语言预处理器、编译器、汇编器和链接器

重点解读:

一、静态链接

使用编译器驱动程序进行程序的翻译和链接linux> gcc -Og -o prog main.c sum.clinux> ./prog下图静态链接结构图。请看图解

image.png

为了构造可执行文件,链接器必须完成两个主要任务:符号解析(我们在代码中会声明变量及函数,之后会调用变量及函数,所有的符号声明都会被保存在符号表(symbol table)中,而符号表会保存在由汇编器生成的 object 文件中(也就是 .o 文件)。符号表实际上是一个结构体数组,每一个元素包含名称、大小和符号的位置。)重定位(这一步所做的工作是把原先分开的代码和数据片段汇总成一个文件,会把原先在 .o 文件中的相对位置转换成在可执行程序的绝对位置,并且据此更新对应的引用符号(才能找到新的位置))

二、动态连接

目标文件有三种形式:一、可重定位目标文件:包含二进制代码和数据。其形式可以在编译时与其他可重定位目标文件合并起来,创建一个可执行目标文件。二、可执行目标文件:包含二进制代码和数据。其形式可以被直接复制到内存并执行。三、共享目标文件:一种特殊类型的可重定位目标文件,可以在加载或者运行时被动态地加载进内存并链接。请看图解

image.png

目标文件纯粹是字节块的集合。这些块中,有些包含程序代码,有些包含程序数据,而其他的则包含引导链接器和加载器的数据结构。

三、编译系统

编译系统的过程图解:

image.pngimage.pngimage.png

四、可重定位目标文件

上面提到的三种对象文件有统一的格式,即 ELF,下图展示了一个典型的ELF可重定位目标文件的格式。

image.png

ELF头:以16字节的序列表述了生成该文件的系统的字大小和字节顺序。剩下的部分包括文件类型、机器类型、节头表位置等。(可以用readelf -l main查看).text:代码。.rodata:只读数据,如printf的格式串、swich的跳转表。.data:已初始化的全局和静态变量。.bss:未初始化/初始化为0的全局和静态变量。仅有节头,节本身不占用磁盘空间,仅仅是一个占位符。.symtab:符号表,函数和全局/静态变量的信息。.rel.text:.text节中的可重定位信息。包括在合并后的可执行文件中需要修改的指令地址。.rel.data:.data节中的可重定位信息。包括在合并后的可执行文件中需要修改的指针数据的地址。.debug:调试符号表。(gcc -g)节头部表:每个节的偏移量、大小。

注:

当汇编器遇到对最终位置未知的目标引用,它就会生成一个重定位条目,告诉链接器在将目标文件合并成可执行文件时如何修改这个引用。代码的重定位条目放在.rel.text中,已初始化数据的重定位条目放在.rel.data中。

ELF重定位条目的格式:

image.png

小结

本文讲述链接,说白了就是代码引用的部分,函数库等等怎么连接在一起,他是将各种代码和数据片段收集并组合成为一个单一文件的过程,这个文件可被加载到内存并执行。链接可以执行于编译时、加载时或者运行时。链接是由链接器自动执行的。

相关文章
用word快速将数字字体换成新罗马详细简单方法
用word快速将数字字体换成新罗马详细简单方法
7667 0
用word快速将数字字体换成新罗马详细简单方法
|
Java
FilenameFilter 实现文件过滤
实现 FilenameFilter 接口的类的实例用于过滤文件名。这些实例被用来过滤类 File 的 list 方法中的目录列表。FilenameFilter 接口很简单,只有一个 accpet 方法
168 0
|
XML Android开发 数据格式
弹出对话-------- AlertDialog 有按钮
引用:http://spooking.tk/post-21.html 创建对话框  一个对话框一般是一个出现在当前Activity之上的一个小窗口. 处于下面的Activity失去焦点, 对话框接受所有的用户交互.
1135 0
|
25天前
|
人工智能 自然语言处理 Shell
🦞 如何在 OpenClaw (Clawdbot/Moltbot) 配置阿里云百炼 API
本教程指导用户在开源AI助手Clawdbot中集成阿里云百炼API,涵盖安装Clawdbot、获取百炼API Key、配置环境变量与模型参数、验证调用等完整流程,支持Qwen3-max thinking (Qwen3-Max-2026-01-23)/Qwen - Plus等主流模型,助力本地化智能自动化。
34857 137
🦞 如何在 OpenClaw (Clawdbot/Moltbot) 配置阿里云百炼 API
|
8天前
|
人工智能 自然语言处理 监控
OpenClaw skills重构量化交易逻辑:部署+AI全自动炒股指南(2026终极版)
2026年,AI Agent领域最震撼的突破来自OpenClaw(原Clawdbot)——这个能自主规划、执行任务的智能体,用50美元启动资金创造了48小时滚雪球至2980美元的奇迹,收益率高达5860%。其核心逻辑堪称教科书级:每10分钟扫描Polymarket近千个预测市场,借助Claude API深度推理,交叉验证NOAA天气数据、体育伤病报告、加密货币链上情绪等多维度信息,捕捉8%以上的定价偏差,再通过凯利准则将单仓位严格控制在总资金6%以内,实现低风险高频套利。
3489 23
|
21天前
|
人工智能 安全 机器人
OpenClaw(原 Clawdbot)钉钉对接保姆级教程 手把手教你打造自己的 AI 助手
OpenClaw(原Clawdbot)是一款开源本地AI助手,支持钉钉、飞书等多平台接入。本教程手把手指导Linux下部署与钉钉机器人对接,涵盖环境配置、模型选择(如Qwen)、权限设置及调试,助你快速打造私有、安全、高权限的专属AI助理。(239字)
7654 22
OpenClaw(原 Clawdbot)钉钉对接保姆级教程 手把手教你打造自己的 AI 助手
|
20天前
|
人工智能 机器人 Linux
OpenClaw(Clawdbot、Moltbot)汉化版部署教程指南(零门槛)
OpenClaw作为2026年GitHub上增长最快的开源项目之一,一周内Stars从7800飙升至12万+,其核心优势在于打破传统聊天机器人的局限,能真正执行读写文件、运行脚本、浏览器自动化等实操任务。但原版全英文界面对中文用户存在上手门槛,汉化版通过覆盖命令行(CLI)与网页控制台(Dashboard)核心模块,解决了语言障碍,同时保持与官方版本的实时同步,确保新功能最快1小时内可用。本文将详细拆解汉化版OpenClaw的搭建流程,涵盖本地安装、Docker部署、服务器远程访问等场景,同时提供环境适配、问题排查与国内应用集成方案,助力中文用户高效搭建专属AI助手。
5279 12