zoukankan      html  css  js  c++  java
  • 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

    连接器符号表条目{
      

  • 相关阅读:
    [ZOJ 4062][2018ICPC青岛站][Plants vs. Zombies]
    [Wannafly挑战赛28][B msc和mcc][预处理+枚举]
    [codeforces Mail.Ru Cup 2018 Round 1 D][ xor 操作]
    [codeforces round#475 div2 ][C Alternating Sum ]
    [zoj4045][思维+dfs]
    [zoj4046][树状数组求逆序(强化版)]
    费马大定理以及求解a^2+b^2=c^2的奇偶数列法则
    【HDOJ3567】【预处理bfs+映射+康拓展开hash】
    POJ1279 Art Gallery 多边形的核
    第八周 Leetcode 44. Wildcard Matching 水题 (HARD)
  • 原文地址:https://www.cnblogs.com/rlee063/p/8520360.html
Copyright © 2011-2022 走看看