linux共享库链接过程

Posted rlee063

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux共享库链接过程相关的知识,希望对你有一定的参考价值。

技术分享图片技术分享图片

一 与静态库链接 

1 符号解析(symbol resolution)

将符号的引用与定义联系在一起。
#引用信息和定义信息在哪儿,怎么联系在一起的
  1)内部符号解析-编译器

  2)外部符号解析-连接器

  技术分享图片

与静态库链接:
    链接器维护三个集合(E:可执行文件集合(U:未解析的符号集合(D:已定义的符号集合对于每一个输入的目标文件,通过里面的符号引用与定义信息来修改U、D中的值。对于库文件,若库中的文件成员m中含有对之前 U 中未解析符号的定义,则将m类似目标文件执行操作,直到U、D不再发生变化(如何判断),则将不包含在E中的目标文件舍弃。链接器完成对输入文件的扫描后,如果U非空则触发符号未定义错误。所以输入文件的顺序尤为重要。

 2 重定位 (relocation)

 2.1 重定位节和符号定义

  技术分享图片

2.2 重定位节中的符号引用

  技术分享图片

二 与动态库链接 

2.0 拷贝重定位和符号表信息

#不拷贝代码和数据节

2.1 重定位

2.1.1 重定位 libc.so 的文本和数据到某个存储器段。
2.1.2 重定位 p2 中所有对由 libc.so 定义的符号和引用。

加载时绑定:

调用时绑定:【为了效率】

  延迟绑定技术:
  第一次调用:引用 -> PLT -> GOT -> PLT -> linker(关键的延迟绑定代码, 回填地址至GOT表中)
  之后调用: 引用-> PLT -> GOT -> address

 =============================================================

深入理解计算机系统

延迟绑定(lazy binding)
GOT(globle offset table)
PLT(procedure linkage table)

符号表 {

  每个可重定位目标文件都有一个符号表,一般的(1本模块全局符号(2本模块函数(3引用的其他模块的全局符号(4非全局符号 会生成符号信息。

  符号表数据结构:

  技术分享图片

重定位表{

  重定位表数据结构:

  技术分享图片

 }

 linker & loader

连接器符号表条目{
  技术分享图片
技术分享图片










以上是关于linux共享库链接过程的主要内容,如果未能解决你的问题,请参考以下文章

如何将共享库链接到Linux中的其他共享库?

C++基础语法梳理:链接装载库丨Linux 的共享库

Linux:链接共享库时如何使用 .pc 文件?

Linux 库应用命令

Linux 共享库链接错误(未定义符号)

链接静态库 Vs。 Linux 中的共享库