《程序员的自我修养》之静态链接

静态链接内容总结:

在这里插入图片描述

内容重难点笔记:

重定位表
对于可重定位的ELF文件来说,它必须包含有重定位表,用来描述如何修改相应的段里的内容。对于每个要被重定位的ELF段都有一个对应的重定位表,而一个重定位表往往就是ELF文件中的一个段,所以其实重定位表也可以叫重定位段,我们在这里统一称作重定位表。

COMMON块
现在的编译器和链接器都支持一种叫 COMMON块( Common Block)的机制这种机制最早源于 Fortran,早期的 Fortran没有动态分配空间的机制,程序员必须事先声明它所需要的临时使用空间的大小 Fortran这种空间叫 COMMON块,当不同的目标文件需要的 COMMON块空间大小不一致时以最大的那块为准。
COMMON类型的链接规则是针对符号都是弱符号的情况,如果其中有一个符号为强符号,那么最终输出结果中的符号所占空间与强符号相同。

全局构造与析构
init该段里面保存的是可执行指令,它构成了进程的初始化代码。因此,当一个程序开始运行时,在main函数被调用之前, Glibe的初始化部分安排执行这个段的中的代码。
fini该段保存着进程终止代码指令。因此,当一个程序的main函数正常退出时,Glibc会安排执行这个段中的代码。
这两个段init和fini的存在有着特别的目的,如果一个函数放到init段,在main函数执行前系统就会执行它。同理,假如一个函数放到fint段,在main函数返回后该函数就会被执行利用这两个特性,C++的全局构造和析构函数就由此现。

以下几个方面会决定目标文件之间是否二进制兼容:
1. 内置类型(如int、 float、char等)的大小和在存储器中的放置方式(大端、小端、对齐方式等)
2. 组合类型(如 struct、 union,数组等)的存储方式和内存分布
3. 外部符号(external-linkage-与用户定义的符号之间的命名方式和解析方式,如函数名
3. func在C语言的目标文件中是否被解析成外部符号func
4. 函数调用方式,比如参数入栈顺序返回值如何保持等
5. 堆栈的分布方式,比如参数和局部变量在堆栈里的位置,参数传递方法等
6. 寄存器使用约定,函数调用时哪些寄存器可以修改,哪些须要保存,等等。

链接控制脚本
链接器一般都提供多种控制整个链接过程的方法,以用来产生用户所须要的文件。一般链接器有如下三种方法
1. 使用命令行来给链接器指定参数,我们前面所使用的d的o、e参数就属于这类。这种方法我们已经在前面使用很多次了。
2. 将链接指令存放在目标文件里面,编译器经常会通过这种方法向链接器传递指令。方法也比较常见,只是我们平时很少关注
3. 使用链接控制脚本,使用链接控制脚本方法就是本节要介绍的,也是最为灵活、最为强大的链接控制方法。

来源《程序员的自我修养》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值