0

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

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

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

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

4

1 回答 1

4

(2) - 正是gcc -fno-plt如此;使用call puts@gotpcrel(%rip)which 引用正常的 GOT 条目,而不是由 PLT stubs 更新的 GOT 部分
请参阅x86_64:是否可以“在线替换”PLT/GOT 引用?


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

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

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

于 2021-10-06T07:13:58.617 回答