以文件的方式放在磁碟(Disk)中的 Object module 有三种形式
一个程序码Source code档案被Compile後,会依照指令和资料部份分开存到Obj File上不同的Section中。
连结的过程就是把多个不同的 obj file 相互"黏"在一起,为了使不同的 obj file 能够相互黏合,必须有固定的规则才行,才能避免连结的过程中不同变数和函数之间的混淆,在连结中,我们将函数很变数称为符号(Symbol),连结过程中很关键的一个部份就是符号的管理,每一个 obj file 都会有一个相对应的符号表(Symbol Tabel) ,记录着目标文件中所用到的所有符号,每个定义的符号都有一个对应值,称为Symbol Value,对於variable和functoin来说,Symbol Value指的就是他们的地址。
还存其他几个不常用到的符号 :
我们可以使用nm指令来查看符号表
连结器如何解析多重定义的全局符号?
在编译阶段, Compiler 会将每个 symbol 分类为 strong 或 weak
Strong Symbol : 包含 procedures 和被初始化过的全域变数。
Weak Symbol : 未被初始化的全域变数。
Linker 利用以下列规则来决定如何做 Linking :
/* foo3.c */
#include <stdio.h>
void f(void);
int x = 15213; // Strong Symbol
int main(){
f();
printf("x = %d\n", x);
return 0;
}
/* bar3.c */
int x; // Weak Symbol
void f(){
x = 15212
}
$ gcc -o foobar3 foo3.c bar3.c
$ ./foobar3
x = 15212
在运行时,函数 f 将 x 的值由15212改为15212,因为连结器将选择定义中的 strong symbol
程序员的自我修养-linker
深入理解计算机系统-linker
Day 27 - 成本估计与 Amazon DynamoDB 观赏鱼辨识成本估计 根据 观赏鱼辨识系...
废宅看到的几个新闻重点 上级机关视察回收厂发现圾垃车满戴、系统资讯与现况不符合,经行政程序报请南调组...
前言 利用刚设计好的帖子页元件, 组合成帖子页。 元件组合 建立一个属於帖子页的frame 先在Pa...
Youtube连结:https://bit.ly/33cfaZS 红黑树有着自我平衡的特性,透过「...
基础 使用时要先下载pip install PyPDF2 读取Pdf页面内容 检查Pdf是否被加密...