CSAPP学习笔记:链接

这篇博客详细介绍了链接过程,包括静态链接例子、链接器的优势和工作步骤,以及静态和动态链接库的原理。重点讲解了链接器如何解析符号和进行重定位,以及在加载时间和运行时期动态链接共享库的机制。最后提到了库打桩技术,展示了如何在运行时替换系统函数实现特定功能。
摘要由CSDN通过智能技术生成

链接

链接详解

静态链接例子

对于两个.c文件,如何形成可执行的目标文件呢?

在这里插入图片描述

在这里插入图片描述

两个源代码分别经过预处理编译器,编译编译器,汇编编译器,生成了两个可重定向的目标文件,再经过链接器,链接成可执行目标文件。(在编译过程中需要指定两个.c文件)

链接器优势

  1. 模块化:程序是由许多小的源文件组成,而不是大的单一文件。并且能构建包含许多函数的库。
  2. 提高效率:节省时间:当修改源文件时,只需要重新编译那个修改的源文件,而不需要重新编译其他源文件。节省空间:公用的函数压缩成库,函数调用库时,只需要加载库中的某一些函数。

链接器的工作步骤

  1. 符号解析(简单解析)
    1. 程序能够定义和引用符号(全局变量或者函数)
    2. 这些符号(全局变量/函数)的定义在目标文件(.o)中以符号表的形式保存着,每一个符号对应着名称,大小,符号位置(以structs形式)
    3. 在符号解析阶段,链接器将每一个符号引用和其定义(名称,大小,符号位置)一一对应。
  2. 重定位阶段
    1. 目的是将分开储存的数据和代码组合成单一区域
    2. 重定位:由符号的相对位置,找到其绝对位置
    3. 更新符号引用中的位置为它们的绝对位置??

一些定义

  • 三种目标文件(object files)(模块)

    • 重定向目标文件(.o file)(汇编器生成的二进制文件):不能直接加载当内存,需要等待链接器的链接,其中数据和代码以某种形式存储(ELF),每一个.o文件对应着一个源文件。
    • 可运行目标文件(a.out file)能够直接加载到内存并运行
    • 共享目标文件(.so file)(共享库):特殊的重定向目标文件,能够在**加载时间??**和运行时
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值