【问题标题】:Loading data segment of already loaded shared library加载已加载共享库的数据段
【发布时间】:2017-07-05 13:49:46
【问题描述】:

要使全局偏移表起作用,GOT 必须位于文本段的固定位置。现在假设一个程序需要一个共享库。还假设操作系统已经为其他进程加载了共享库。现在对于我们的程序,由于共享库的文本部分已经加载,它只需要加载数据段。共享库文本部分被映射回我们进程的虚拟地址。但是,如果在我们共享库的虚拟地址的固定偏移量处已经有一些数据/文本或其他内容怎么办。动态链接器如何解决这种冲突?一种方法是将 R_386_GOTPC 留在文本部分直到加载时间,并让动态链接器将其更改为新的偏移量。这是在实践中如何完成的。

【问题讨论】:

    标签: gcc ld elf


    【解决方案1】:

    在 GNU 上,即使是同一个 DSO 也会映射到不同进程的不同地址。它们之间根本不共享任何数据。这意味着 GOT 只是私有数据(如 .data),并在加载时使用正确的地址(存根或使用 BIND_NOW 的正确函数地址)进行初始化。

    (这假设prelink 没有被使用,无论如何这有点坏了。)

    【讨论】:

      猜你喜欢
      • 2019-02-10
      • 1970-01-01
      • 2018-04-07
      • 1970-01-01
      • 1970-01-01
      • 2019-04-17
      • 1970-01-01
      • 2012-06-19
      • 1970-01-01
      相关资源
      最近更新 更多