ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

理解链接时要注意的问题

2020-12-20 13:01:51  阅读:253  来源: 互联网

标签:时要 定位 静态 理解 so 文件 库函数 链接 加载


引言
连接就是将各种代码和数据片段收集并组合成为一个单一文件的过程,这个文件可以被加载到内存中执行。

编译器驱动程序
gcc-E可以进行预处理,gcc-c编译,gcc-s可以产生汇编代码。

静态链接与动态链接的区别

  • 静态库函数代码包含在进程代码中,而共享库代码不包含在进程代码段中。
  • 静态链接情况下静态库函数在加载时被连接,动态连接情况下共享库函数可在加载或运行时被连接。
  • 静态库函数更新后需对称性重新编译和连接,而共享库函数更新后程序无需重新编译和连接。
  • 静态库函数代码包含在可执行目标文件中,而共享库函数代码不包含在可执行目标文件中。

注意:无论是静态库还是动态库都要把所需的代码段加载到内存方可运行。

可重定位目标文件
在这里插入图片描述
这里要注意:.real.text节计入了重定位信息,一般情况下任何调用外部函数或者引用全局变量的指令都需要计入下来,在重定位之后进行修改;.real.data节任何已初始化的全局变量或初始值是一个全局变量地址或者外部定义函数的地址,都需要先被记录下来,等到重定位之后修改,这是非常重要的重定位信息。

符号
这里根据个人经验简单总结一下:由此模块定义并能被其他模块引用的符号就是全局符号,而由此模块定义并已经被其他模块引用的全局符号就是外部符号,由此模块定义并只能被此模块引用的符号就是局部符号,他一般对应于静态属性的函数或全局变量。

如何计算重定位
这里是本模块的一个难点,考察的方式有很多,下面我们就来看一下如何来看重定位的汇编语言

在这里插入图片描述

从此汇编中不难看出有两种重定位方法:pc相对定位的sum的offset是oxf,addend是-4,array的绝对定位offset是0xa,addend是0。要注意的是绝对引用的offset在绝对引用中是用不到的。

可执行目标文件
在这里插入图片描述
可执行目标文件的格式类似于可重定位目标文件,但不完全相同。ELF头包含了文件的总体格式,程序在运行时要执行的第一条指令的地址。.text、.rodata、.data节已经被重定位到他们最终的运行时的内存地址。函数的初始化代码会调用.init节中的_init。

如何加载可执行目标文件
在这里插入图片描述
程序会通过调用execve函数来调用加载器,加载器将可执行目标文件中的代码和数据从磁盘中加载到内存中,然后跳转到程序的第一条指令地址来运行该程序。这里注意:在Linux x86-64系统中,代码段是从0x400000处开始,接下来是数据段,一直是由下向上增长的。

如何动态来连接共享库
在这里插入图片描述

静态库虽好,但有一个致命的缺陷:随着功能的扩展需要定期维护和更新。二共享库就可以结束这个缺陷。在运行或加载时,共享库可以加载到任意内存地址,并和一个在内存中的程序连接起来。如上图,一个库只有一个.so文件。所有引用该库的可执行目标文件共享这个。
我们需要调用编译器驱动程序给编译器和连接器指令:linux>gcc -shared -fpic -o libvector.so addvec.c multvec.c
-fpic命令就生成了一个与位置无关的代码,-shared选项指示连接器创建一个共享目标文件,而后给出指令:linux> gcc -o -prog21 main2.c ./libvector.so
这样就可以创建一个可执行目标文件prog21,此文件就可以使得它在运行时可以和libvector.so连接。此外要注意:

  • 重定位libc.so的文本和数据到某个内存段。
  • 重定位libvector.so的文本和数据到另一个内存段。
  • 重定位prog21中所有对由libc.so和libvector.so定义的符号引用。

还有特别重要的一点与静态连接所不同的是当连接器将控制传递给应用程序时,共享库的位置就固定了,并在此后的程序运行的任何时刻绝不会改变。

以上就是我对连接一块的重点与难点的整理,希望对阅读此文章的小伙伴有帮助,谢谢大家的阅读。

标签:时要,定位,静态,理解,so,文件,库函数,链接,加载
来源: https://blog.csdn.net/likunchengg/article/details/111410965

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有