【问题标题】:Understanding GOT (Global Offset Table) and PLT?了解 GOT(全局偏移表)和 PLT?
【发布时间】:2021-11-26 08:24:45
【问题描述】:

在写这个问题之前,我想强调一下,我自己研究了 阅读了数十篇文章,但仍然没有解决这个问题,我得到的解释根本没有意义(也许是因为我是连接世界的新手)。所以我希望有人可以提供简单而非常详细的答案。

我知道 GOT(全局偏移表)可以帮助我们解析动态链接中从另一个引用的全局符号。另外我读到:“每个共享库都有自己的 GOT”

  1. 但这是有问题的,如果 2 个程序使用同一个共享库怎么办?两者都将具有相同的全局变量值,但情况并非如此。

  2. 至于我的 MAIN 问题:如果我不想使用惰性绑定,那么为什么我们需要 PLT,为什么不直接使用普通 GOT 作为变量?

【问题讨论】:

    标签: assembly linker static-libraries dynamic-linking got


    【解决方案1】:

    (2) - 这正是gcc -fno-plt 所做的;使用 call puts@gotpcrel(%rip) 引用正常的 GOT 条目 not the part of the GOT that's updated by PLT stubs
    x86_64: Is it possible to "in-line substitute" PLT/GOT references?


    (1)“每个共享库都有自己的 GOT”是指相对于每个进程拥有一个。这并不是说共享内存中的库只有一个 GOT,每个使用该库的进程都映射。

    请记住,类 Unix 操作系统(与所有现代主流操作系统一样)使用虚拟内存将进程彼此隔离,因此通常不用说每个进程都有自己独立的读/写数据副本。

    当然,像 errnoenviron 这样的全局变量不会在使用同一个库的进程之间共享,这会破坏事情,因此您可以排除这种解释。 (如果你strace /bin/ls,这不是动态链接所做的)

    【讨论】:

      猜你喜欢
      • 2017-03-24
      • 2018-09-23
      • 1970-01-01
      • 1970-01-01
      • 2012-03-30
      • 2010-10-10
      • 2021-10-04
      • 2015-02-11
      相关资源
      最近更新 更多