计算机系统课程 笔记总结 CSAPP第七章 链接(7.1-7.13)

2023-11-15

目录

7.1 编译器驱动程序

7.2 静态链接

7.3 目标文件

7.4 可重定位目标文件

7.5 符号和符号表

7.6 符号解析

7.6.1 链接器如何歇息多重定义的全局符号

7.6.2 与静态库链接

7.7 重定位

7.7.1 重定位条目

7.7.2 重定位符号引用

7.7.2.1 相对引用

7.7.2.2 绝对引用

7.8 可执行目标文件

7.9 加载可执行目标文件

7.10 动态链接共享库

7.11 从应用程序中加载和链接共享库 

7.12 位置无关代码

7.13 库打桩机制


 

7.1 编译器驱动程序

  • 使用编译器驱动程序compiler driver进行程序的翻译和链接:
    • linux> gcc -Og -o prog main.c sum.c
    • linux> ./prog
  • 加载器loader
    • 将可执行文件prog中的代码和数据复制到内存
    • 然后将控制转移到这个程序的开头

 


7.2 静态链接

为什么用链接器?

  • 模块化
    • 程序可以编写为一个较小的源文件的集合,而不是一个整体巨大的一团.
    • 可以构建公共函数库 (稍后详述)
      • 例如, 数学运算库, 标准C库
  • 效率
    • 时间: 分开编译
      • 更改一个源文件,编译,然后重新链接.
      • 不需要重新编译其他源文件.
    • 空间: 库
      • 可以将公共函数聚合为单个文件...
      • 然而,可执行文件和运行内存映像只包含它们实际使用的函数的代码.

 

  • 静态链接器 static linker
    • 输入:一组可重定位目标文件和命令行参数
      • 各种不同的代码
      • 数据节 section,连续的字节序列
    • 输出:一个完全链接的、可以加载和运行的可执行目标文件作为输出
    • 例:Linux LD
  • 任务
    • 符号解析 symbol resolution
      • 目标文件定义和引用:符号、函数、全局变量、静态变量(static)
      • 链接器将每个符号引用正好与一个符号定义关联起来
    • 重定位 relocation
      • 将多个单独的代码节和数据节合并为单个节
      • 将符号从它们的在.o文件的相对位置重新定位到可执行文件的最终绝对内存位置
      • 更新所有对这些符号的引用来反映它们的新位置

 

 


7.3 目标文件

  • 可重定位目标文件(.o 文件)
    • 包含与其他可重定位目标文件相结合的代码和数据,以形成可执行的目标文件.
    • 每一个.o文件是由一个源(.c)文件生成的
  • 可执行目标文件(a.out 文件)
    • 包含可以直接复制到内存并执行的代码和数据.
  • 共享目标文件(.so 文件)
    • 特殊类型的可重定位目标文件,在其他的加载时或运行时,它可以被动态加载到内存,并被动态链接
    • 在Windows中称为动态链接库.DLL

 

  • 目标模块就是一个字节序列
  • 目标文件就是一个以文件形式存放再磁盘中的目标模块

 

  • Linux&Unix:   Executable and Linkable Format
  • Windows:       Portable Executable
  • 目标文件的标准二进制格式:ELF二进制文件
  • 一个统一的格式:
    • 可重定位目标文件(.o),
    • 可执行目标文件(a.out)
    • 共享目标文件(.so)
  • 工具:    readelf  文件名

 


7.4 可重定位目标文件

ELF目标文件格式

  • Elf 头
    • 字大小、字节顺序、文件类型(.o,exec,.so),机器类型,等等
  • 段头表/程序头表
    • 页面大小,虚拟地址内存段(节),段大小
  • .text 节(代码)
    • 代码
  • .rodata 节(只读数据)
    • 只读数据 :  跳转表, ...
  • .data 节 (数据/可读写)
    • 已初始化全局变量
  • .bss 节 (未初始化全局变量)
    • 未初始化的全局变量
    • 符号开始的块
    • 更加节省空间
    • 有节头,但不占用空间
  • .symtab 节(符号表)
    • 符号表
    • 函数和静态变量名
    • 节名称和位置
  • .rel.text 节(可重定位代码)
    • .text 节的可重定位信息
    • 在可执行文件中需要修改的指令地址
    • 需修改的指令.
  • .rel.data 节(可重定位数据)
    • .data 节的可重定位信息
    • 在合并后的可执行文件中需要修改的指针数据的地址
  • .debug 节(调试)
    • 为符号调试的信息 (gcc -g)
  • 节头表Section header table
    • 每个节的偏移量和大小

 


7.5 符号和符号表

  • 全局符号
    • 由模块m定义的,可以被其他模块引用的符号
    • 例如: 非静态non-static C 函数与非静态全局变量.
  • 外部符号
    • 由模块m引用的全局符号,但由其他模块定义
  • 本地/局部符号
    • 模块m定义和仅由m唯一引用的符号
    • 如:使用静态属性定义的C函数和全局变量
    • 本地链接符号不是本地程序变量-局部变量

 


7.6 符号解析

7.6.1 链接器如何歇息多重定义的全局符号

 

  • 程序符号要么是强符号,要么是弱符号
    • 函数初始化全局变量
    • : 未初始化的全局变量

 

 

链接器的符号处理规则

  • 规则 1:不允许多个同名的强符号
    • 每个强符号只能定义一次
    • 否则: 链接器错误
  • 规则 2:若有一个强符号和多个弱符号同名,则选择强符号
    • 对弱符号的引用解析为强符号
  • 规则 3:如果有多个弱符号,选择任意一个
    • 可以用 gcc –fno-common 来覆盖这个规则

 

全局变量

  • 避免:如果你能---尽量---这样程序的模块化好
  • 否则
    • 使用 static :如果你能
    • 定义了一个全局变量,就初始化它
    • 使用 extern :如果你引用了一个外部全局符号

 

7.6.2 与静态库链接

 

  • 静态库 (.a 存档文件)
    • 将相关的可重定位目标文件连接到一个带有索引的单个文件中(叫做存档文件).
    • 增强链接器,使它尝试通过查找一个或多个存档文件中的符号来解决未解析的外部引用.
    • 如果一个存档成员文件.o解析了符号引用,就把它链接入可执行文件

 

 


7.7 重定位

  • 重定位节和符号定义
    • 链接器将所有相同类型的节合并为同一类型的新聚合节
    • 链接器将运行时内存地址赋给新的聚合节,赋给输入模块定义的每个节以及每个符号
    • 程序中的每条指令和全局变量将有唯一的运行时的内存地址
  • 重定位节中的符号引用
    • 链接器修改代码节和数据节中对每个符号的引用,使它们指向正确的运行时的地址
    • 要执行这一步,链接器依赖于可重定位目标模块中称为 重定位条目 relocation entry 的数据结构

7.7.1 重定位条目

  • offset
    • 需要被修改的引用的节偏移
  • symbol
    • 标识被修改引用应该指向的符号
  • type
    • 如何修改新的引用
    • R_X86_64_32 array
      • 绝对地址引用
    • R_X86_64_PC32 sum-0x4
      • 相对地址引用
  • attend
    • 有符号常数
    • 偏移调整

7.7.2 重定位符号引用

7.7.2.1 相对引用

7.7.2.2 绝对引用

 


7.8 可执行目标文件

 


7.9 加载可执行目标文件

 


7.10 动态链接共享库

  • 当执行文件第一次加载和运行时(加载时链接),动态链接就会出现.
    • Linux的常见情况是,由动态链接器(ld-linux.so)自动处理.
    • 标准C (libc.so)通常是动态链接的.
  • 动态链接也可以在程序启动后进行(运行时链接).
    • Linux中,这是通过调用dlopen()接口完成的.
      • 分布式软件.
      • 高性能web服务器.
      • 运行时库打桩.
  • 共享库的例程可以由多个进程共享.
    • 当我们学习虚拟内存时有更多关于这个的内容

 


7.11 从应用程序中加载和链接共享库 


7.12 位置无关代码


7.13 库打桩机制

  • 安全
  • 调试
  • 库打桩机制:   强大的链接技术--- 允许程序员拦截对任意函数的调用
  • 打桩可出现在:
    • 编译时:源代码被编译时   
    • 链接时:当可重定位目标文件被静态链接来形成一个可执行目标文件时
    • 加载/运行时:当一个可执行目标文件被加载到内存中,动态链接,然后执行时
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

计算机系统课程 笔记总结 CSAPP第七章 链接(7.1-7.13) 的相关文章

  • 浮点数表示法(总结自CS61C和CMU CSAPP)

    总结自伯克利的CS61C2021秋季课程 xff0c Nick主讲和CMU2015年讲CS APP的课程 xff0c 标题均是floating point xff0c 相比而言CMU讲得比较详细 xff0c 我先看了一遍CS61C再看了一遍
  • GCC编译过程,了解编译原理

    说明 这篇文件是在读 程序员的自我修养 链接 装载与库 的一点笔记 权当时学习的记录 1 GCC编译过程分解 以HelloWorld程序为例 2 预编译 规则 命令 gcc E XXX c o XXX i 3 编译 词法分析 语法分析 语义
  • 汇编指令之MOV

    汇编指令之 MOV 传送字或字节 学习来自 汇编语言MOV指令 mov指令详解 Assembly Addressing Modes 汇编用户指南 MOV 简单格式 mov dst src 扩展格式1 MOV S cond Rd Operan
  • CSAPP阅读笔记——第二章:信息的表示和处理

    核心内容 编码原则 无符号 补码 浮点 溢出 无符号 补码 精度 浮点 一 信息存储 字节 存储最小单元 程序的内存管理是在虚拟地址层面上 字长 用于指明整数和指针数据的大小 编码虚拟地址 决定虚拟地址空间大小 数据大小 编码数字的格式 其
  • 进程的地址空间概述

    前言 每台计算机都有一些主存用来保存正在执行的程序 在一个非常简单的操作系统中 仅仅有一个应用程序运行在内存中 第二个应用程序必须等待 为了运行第二个应用程序 需要把第一个应用程序移除才能把第二个程序装入内存 这种频繁的装入内存的操作是很没
  • HIT-ICS大作业

    计算机系统大作业 题目 程序人生 Hello s P2P 计算机科学与技术学院 摘 要 大作业题为程序人生 Hello s P2P 围绕一个较简单的hello c函数的整个生命周期展开 介绍了该示例程序从编写到执行到结束的全过程 详细地分析
  • 【云原生之Docker实战】使用Docker部署Linkstack链接共享平台

    云原生之Docker实战 使用Docker部署Linkstack链接共享平台 一 Linkstack介绍 二 本地环境介绍 2 1 本地环境规划 2 2 本次实践介绍 三 本地环境检查 3 1 检查Docker服务状态 3 2 检查Dock
  • 计算机的内存

    物理内存 内存是电脑的一个硬件组成部分 从单片机的组成我们可以看到 CPU 内存和输入输出接口 就组成一个完整的电脑 其他统统属于外设 内存是可以被CPU通过总线进行操作的 也就是与CPU之间有总线相连接的 电脑所有的输入输出 都是要从内存
  • 哈工大2018秋高级语言程序设计课程大作业

    Github文件下载地址哈工大2018秋高级语言程序设计课程 高级语言程序设计 实验大作业反思报告 实验大作业题目 智能趣味电子通讯录 类型 信息管理系统 学生姓名 郭茁宁 班 号 1837101 学 号 1183710109 所在院系 计
  • 深入理解计算机系统Lab3实验

    目录 实验准备 实验资源的准备 生成ctarget等文件的反汇编代码 确定实验环境是大端还是小端 实验进行 Phase1 简述 测试 分析 目标 找到touch1的代码并重写 并且 找到getbuf 函数中 为Get 函数所开辟的字符串最大
  • CSAPP第三版运行时打桩Segmentation fault

    CSAPP第三版7 13 3节提到了运行时打桩机制 它可以在运行时将程序中对共享库函数的调用进行截获 替换为执行自己的代码 这个机制基于动态链接器的LD PRELOAD环境变量 如果LD PRELOAD环境变量被设置为一个共享路径名的列表
  • 计算机浮点数规格化表示

    说明 在IEEE标准中 浮点数在内存中的表示是将特定长度的连续字节的所有二进制位按特定长度划分为符号域 指数域和尾数域三个连续域 float float类型在内存中占用的位数为 1 8 23 32bits double 1 11 52 64
  • 运行时链接

    基本概念 运行时链接 是在程序运行时 而非编译时或加载时 将程序代码与其依赖的库代码进行链接的过程 动态链接在程序启动时或实际运行过程中通过API函数完成 这种方式的主要优点是它允许程序在运行时加载和卸载不同的库模块 从而实现更高的模块化和
  • 8086CPU只有16位寄存器,却可以访问20位的物理地址

    一 背景介绍 Intel 8086是一个由Intel于1978年所设计的16位微处理器芯片 是x86架构的鼻祖 它是以8080和8085的设计为基础 拥有类似的寄存器组 但是数据总线扩充为16位 总线界面单元 Bus Interface U
  • 什么是环境变量?为什么java要配置环境变量?

    本文是将https blog csdn net qq 37872792 article details 80642985 与 https blog csdn net Pre waist L article details 79696507两
  • 计算机系统课程 笔记总结 CSAPP第七章 链接(7.1-7.13)

    GitHub计算机系统CSAPP课程资源 计算机系统课程 笔记总结 CSAPP第二章 信息的表示和处理 2 1 2 2 计算机系统课程 笔记总结 CSAPP第二章 信息的表示和处理 2 3 2 4 计算机系统课程 笔记总结 CSAPP第三章
  • 操作系统CPU调度

    概述 多道程序操作系统的基础 通过在进程之间切换CPU 操作系统可以提高计算机的吞吐率 对于单处理器系统 每次只允许一个进程运行 任何其他进程必须等待 直到CPU空闲能被调度为止 CPU按一定的调度算法从就绪队列中选择一个进程 把CPU的使
  • http和Tcp的长连接和短连接

    转自 https www cnblogs com fubaizhaizhuren p 7523374 html http协议和tcp ip 协议的关系 1 http是应用层协议 tcp协议是传输层协议 ip协议是网络协议 2 IP协议主要解
  • 【科普】CRC校验(一)什么是CRC校验?

    目录 CRC 循环冗余校验 CRC 校验码的生成 CRC 的发送方与接收方 发送方 接收方 除法异或运算示意图 CRC 循环冗余校验 CRC Cyclic Redundancy Check 循环冗余检验 是一种用于检测数字数据错误的技术 作
  • CSAPP学习记录-Course Overview

    这是我开始学习CSAPP的笔记的第一遍 在接下来的内容 我会分享自己在学习CSAPP时的笔记 感受等等 学习资料来自b站 声明 所有内容基于自己的理解 如有错误感谢大家指出 链接 https www bilibili com video B

随机推荐

  • BIG Endian 和 Little Endian(small endian)模式的区别

    BIG Endian 和 Little Endian small endian 模式的区别 谈到字节序的问题 必然牵涉到两大CPU派系 那就是Motorola的PowerPC系列CPU和Intel的x86系列CPU PowerPC系列采用b
  • QT 打开指定目录并选中指定文件

    目录 方法一 使用Qt自带的方法 方法二 使用windows自带工具 有时自动生成文件之后 点击某个按钮我们希望能够自动跳转到文件所在目录 打开之后不依附于运行程序 可能还需要选中该文件 环境 win10 Qt5 9 6 MinGW 方法一
  • 江苏大学计算机学院林琳,计算机学院教师岗副高及以下、其它专技中级及以下人员岗位聘用结果公示...

    副教授五级 6人 按姓名拼音排序 下同 毕建良 李峰 林庆 毛启容 王良民 朱利平 副教授六级 14人 陈伟鹤 韩飞 李莉 李星毅 潘雨青 钱少先 王洪金 熊书明 杨利霞 曾兰玲 赵念强 周从华 朱小龙 邹志文 副教授七级 13人 蔡涛 陈
  • Docker启动一个Centos镜像

    搜索可用的centos的docker镜像 docker search
  • 第三届国际金融科技论坛开幕,神州信息专家参与蓉城“论道”

    10月30日至31日 由西南财经大学 加州大学伯利克分校国际风险数据分析联盟 成都市地方金融监督管理局联合主办的 第三届国际金融科技论坛 SWUFE CDAR 2020 在成都举行 神州信息金融战略本部副总裁潘志江 神州信息金融科技首席风控
  • google 图片下载

    def xia url headers headers user agent Mozilla 5 0 Windows NT 10 0 WOW64 AppleWebKit 537 36 KHTML like Gecko Chrome 78 0
  • Cadence 17.4 使用TIPS: Orcad 输出PDF

    首先File gt Export gt PDF PDF Export 设置页面 其中有4个输出工具供选择 此处我选择第一个Acrobat Distiller 这个是电脑里安装了咱们常用的Adobe Acrobat DC 就会自带的程序 如果
  • 线性分组码最小汉明距离_信息与编码系列(六)线性码~线性代数

    目录 序 线性码的矩阵描述 线性码的等价性 线性码的最小距离 标准数组 Standard Array 校验子解码 Syndrome Decoding 序 这篇文章相当于做一篇 索引 将线性代数的东西和线性码对应起来 方便日后出现问题能够快速
  • jsp调用服务器上的其他程序(C程序)

    String area dz String req getParameter area String id dz String req getParameter id String ip 10 xxx x xx String encodeS
  • SAM-DETR学习笔记Accelerating DETR Convergence via Semantic-Aligned Matching

    Abstract 最近开发的DEtection TRansformer DETR 通过消除一系列手工制作的组件 建立了一个新的对象检测范式 然而 DETR的收敛速度非常慢 这大大增加了培训成本 我们观察到 慢收敛主要归因于在不同特征嵌入空间
  • dropout层

    深度神经网 DNN 中经常会存在一个常见的问题 模型只学会在训练集上分类 过拟合现象 dropout就是为了减少过拟合而研究出的一种方法 一 简介 当训练模型较大 而训练数据很少的话 很容易引起过拟合 一般情况我们会想到用正则化 或者减小网
  • EIGamal数字签名的实现(c++)——大三密码学实验

    实验原理 1 密钥产生 Alice要对一个消息签名 她选择一个大素数p和一个本原根g 选择一个秘密整数 并且计算 p g y 公开 x秘密保存 注 EIGamal签名方案的安全性在于x的保密性 由于离散对数学问题难解 很难由 p g y 确
  • 电脑上显示打印机无法连接服务器错误代码,电脑怎么连接打印机显示错误代码的解决办法...

    下面来看看小编为您整理的电脑怎么连接打印机显示错误代码的答案 电脑怎么连接打印机显示错误代码内容导航1 连接不上打印机错误0x00000709 打印机出现0x00000709错误代码可能是因为网络或者打印设置错误 具体解决步骤如下 1 首先
  • 关于APP接口设计

    最近一段时间一直在做APP接口 总结一下APP接口开发过程中的注意事项 1 效率 接口访问速度 APP有别于WEB服务 对服务器端要求是比较严格的 在移动端有限的带宽条件下 要求接口响应速度要快 所有在开发过程中尽量选择效率高的框架 PHP
  • golang获取当前时间,前n天时间,以及时间格式的转化

    获取当前时间 currentTime time Now currentTime 的结果为go的时间time类型 2018 09 27 13 24 58 287714118 0000 UTC 获取前n天的时间 获取两天前的时间 current
  • idea中jar包依赖了但还是找不到类的解决方案

    新项目check到本地 导入到idea中后 编译的时候很多类都报错了 打开发现有些框架中的类找不到 现象为 控制台报错 点击这个包 明明发现是有这个依赖的 说明项目是依赖了这个jar包的 打开项目配置 查看依赖树 问题找到 idea这里将这
  • 机器学习实验基础

    文章目录 一 机器学习是什么 二 实验方法和原则 1 评价指标 1回归任务 2分类任务 3特定任务 2 数据集 3 实验验证 随机重复实验 K fold 交叉实验 三 总结 课程链接 学堂在线 张敏老师机器学习算法训练营 一 机器学习是什么
  • sparkStreaming对接kafka

    ReceiverAPI 需要一个专门的Executor去接收数据 然后发送给其他的Executor做计算 存在的问题 接收数据的Executor和计算的Executor速度会有所不同 特别在接收数据的Executor速度大于计算的Execu
  • shell脚本编程之循环

    内容预知 1 循环的定义 2 for循环 2 1 for循环的基本用法 运用演示1 列表打印 运用演示二 分类打印 运用演示三 累加求和 2 2 for循环读取文件作为循环条件 运用演示 2 3 for循环的多线程运用 运用演示 2 4 f
  • 计算机系统课程 笔记总结 CSAPP第七章 链接(7.1-7.13)

    GitHub计算机系统CSAPP课程资源 计算机系统课程 笔记总结 CSAPP第二章 信息的表示和处理 2 1 2 2 计算机系统课程 笔记总结 CSAPP第二章 信息的表示和处理 2 3 2 4 计算机系统课程 笔记总结 CSAPP第三章