alg*_*lgo 2 assembly linker dynamic-linking static-libraries got
在写这个问题之前,我想强调一下,我自己做了几周的研究,阅读了数十篇文章,但这个问题仍然没有解决,而且我得到的解释根本没有意义(也许是因为我是链接世界的新手) )。所以我希望有人能提供简单但非常详细的答案。
我知道 GOT(全局偏移表)可以帮助我们解析动态链接中从另一个引用的全局符号。另外我读到:“每个共享库都有自己的 GOT”
但这是有问题的,如果两个程序使用同一个共享库怎么办?两者对于全局变量都有相同的值,但事实不应该如此。
至于我的主要问题:如果我不想使用惰性绑定,那么为什么我们需要 PLT,为什么不直接使用普通的 GOT 来处理变量呢?
(2) - 正是如此gcc -fno-plt;usingcall puts@gotpcrel(%rip)它引用正常的 GOT 条目,而不是由 PLT 存根更新的 GOT 部分。
请参阅x86_64:是否可以“内联替代”PLT/GOT 引用?
(1) “每个共享库都有自己的 GOT ”,而不是每个进程都有一个。这并不是说共享内存中的库只有一个 GOT,每个使用该库的进程都可以映射。
请记住,类 Unix 操作系统(如所有现代主流操作系统)使用虚拟内存来相互隔离进程,因此通常不言而喻,每个进程都有自己独立的读/写数据副本。
当然,全局变量(例如errno或 )environ不会在使用同一库的进程之间共享,这会破坏事物,因此您可以排除这种解释。(以及不是动态链接正在做的事情,如果你strace /bin/ls)