第四章 静态链接

空间与地址分配

将不同的*.o文件组合成一个可执行文件时,各个文件中各个段的排列顺序。

在将各个.o文件合并成一个可执行文件时,并不时简单的将各个文件直接排列在最终的可执行文件中。
这样做的坏处是,因为对齐的原因造成内存空间中大量的内部碎片。

因此做法是合并相似的段,比如各个文件的.text段,最终都合并在一个.text中。
(不过顺序还不太清楚)

不同的输入顺序

链接

链接器一般采用两步链接:

  1. 空间与地址分配
    也就是上面的那步,当合并以后,计算出各段合并以后的长度和位置,建立映射关系。
    也就是符号表中的值需要改变。
  2. 符号解析与重定位
    该过程确定了每个一些段加载进虚拟地址空间的地址。
    从重定位表中获取要重定位的符号,然后去符号表中的全局符号中去寻找该符号。

COMMON块

和强弱符号一样,只是针对全局符号
源于链接器不能识别类型,只能识别大小

如果模块中的一个全局符号是只声明,而未定义,那么该符号为一个弱符号。
如果声明并定义了,那么该符号是一个强符号。
而通过extern引入的符号不是强符号也不是弱符号(应为它可能在别的地方定义了)。
当在一个模块中,处理弱符号的时候,编译器其实是无法得知该符号最终的类型的。因为其他模块可能定义该符号,编译器需要去其他模块寻找。
但是这时候,编译器,还不知道该符号的大小,因为类型未知,所以大小也未知,因此还不能放入.bss段,因为.bss段的类型都是类型大小已知的,也就是一些局部静态变量。
弱符号:应该只存在在符号表中,被标记为COMMON。(其中符号表中的富豪所在段的值为0xFF2,表示是一个COMMON)
在链接的时候,确定类弱符号的最终大小,一般都是弱符号就取最大的,如果有强符号就取强符号,但是此时如果存在弱符号大小大于强符号,链接器报错。
当该变量是为初始化的全局变量时,链接时,确认了大小,还是会被放在.bss段中。

C++相关

重复代码问题

C++的模板,外部内联函数和虚函数表都可能在不同的便一单元中生成相同的代码。
模板这块再看看书
编译器主流的方法是,将每个模板函数放在同一个段中。
另外提供函数级别的链接,编译出来的文件小,但是编译速度慢

全局构造与析构

C++的全局对象构造在main()之前,析构在main()之后,分别在.init.finit两个段中。

ABI

API指的是源代码级别的接口,而ABI是二进制层面的接口,其兼容性比API要严格。
ABI涉及到:

  1. 内置类型的大小在存储器中存放的方式
  2. 组合类型的存储方式和内存分布
  3. 符号修饰
  4. 函数调用方式:参数入栈顺序,返回值保存
  5. 堆栈分布,参数和局部变量在堆栈里的位置,参数传递方式。
  6. 寄存器约定
  7. 集成体系的内存分布
  8. 指向成员函数的指针的内存分布,如果通过指针调用成员函数,如何传递this
  9. 如何调用虚函数,虚函数表的内容和分布形式,vtable指针在obj中的位置
  10. 模板如何实例化
  11. 全局对象的构造和西沟
  12. 异常的产生和补货
  13. 标准库的一些细节
  14. 内嵌函数的访问细节。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,529评论 5 475
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,015评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,409评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,385评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,387评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,466评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,880评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,528评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,727评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,528评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,602评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,302评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,873评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,890评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,132评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,777评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,310评论 2 342

推荐阅读更多精彩内容