CMU 15-213 Introduction to Computer Systems学习笔记(12) Linking

Linking

Example C Program

Static Linking

Why Linkers?

那么我们为什么这样做的,为什么允许这种所谓的分离编译,为什么不喜欢一个包含所有代码的大文件。

Reason 1: Modularity模块化

  • 允许将代码分解成更小的部分
  • 创建共有函数的库,比如Math 库, 标准 C 库

Reason 2: Efficiency效率

  • 分离编译,只改变一个源文件,编译后再连接整合;不需要重新编译其他文件
  • 使用标准库中的所有功能,可以将它们放在一起

What Do Linkers Do?

在符号解析阶段,链接器将符号引用和符号定义相关联,这中间可能会有一些问题,比如在多个模块中,你可能会声明一个有相同名称的全局变量,链接器必须决定将其中的某个定义用于所有后续索引。

在重定位步骤器件,链接器会决定当程序运行时,每个符号最终将位于x中的存储区的哪里,并且它将那些绝对存储器位置绑定到符号。

Three Kinds of Object Files (Modules)

Linker Symbols

Step 1: Symbol Resolution

How Linker Resolves Duplicate Symbol Definitions

Linker’s Symbol Rules

 

Step 2: Relocation

Relocation Entries

这里的重点是链接器有足够的信息来实际填充正确的地址。

 

Packaging Commonly Used Functions

Modern solution: shared libraries

Dynamic Linking at Load-time

在分享库的解决办法中,我们首先要创建一个共享库而不是一个archive文件,我们创建一个.so文件,使用gcc的共享参数-shared

(到这里我听的人晕了哈哈哈哈)

Case study: Library interpositioning

库打桩的目的是截获来自库的函数调用,以及处于某种原因截获它们后做一些事情,我们通常想要做的就是截获一个函数调用,也许记录一些统计数据或者是做一些错误检查。

 

Some Interpositioning Applications

老师说这是一种非常酷的技术,但是我全程(懵逼)!之后有时间再看一次吧,应该会懂的更多一点。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值