在写这个问题之前,我想强调一下,我为Week做了我自己的研究,读了几十篇文章,但这个问题还是没有解决,我得到的解释根本就没有意义(也许是因为我刚开始联系世界)。因此,我希望有人能提供简单而又详细的答案。
我知道GOT (全球偏移表)帮助我们解析动态链接中的全局符号,这些符号是从另一个链接中引用的。此外,我还读到:“每个共享库都有自己的GOT”
关于我的
发布于 2021-10-05 23:13:58
(2) -这正是gcc -fno-plt
所做的;使用引用普通GOT条目的call puts@gotpcrel(%rip)
,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”指的是每个进程有一个。这并不是说共享内存中的库只有一个,每个进程都使用库映射。
请记住,类似Unix的OSes (和所有现代主流OSes一样)使用虚拟内存来相互隔离进程,因此通常不用说,每个进程都有自己独立的读/写数据副本。
当然,像errno
或environ
这样的全局变量不会在使用相同库的进程之间共享,这样就可以排除这种解释。(如果您使用strace /bin/ls
,也不是动态链接所做的事情)
https://stackoverflow.com/questions/69460917
复制