为什么使用GOT引用共享对象中定义的非静态全局变量?

问题描述:

我是指在模块中定义的非静态全局变量,而不是外部变量。为什么使用GOT引用共享对象中定义的非静态全局变量?

为什么要通过GOT来引用?为什么不使用相对地址?(因为.data段中的全局变量与.text段中的参考之间的距离是常数,所以它也是位置无关的)

+0

您有一个动态库,它包含通过GOT引用的全局变量,但您希望以其他方式访问它。那是对的吗? – jweyrich 2011-02-01 12:34:04

+0

不,我正在阅读关于动态连接器是如何工作的,根据我所读到的,全局变量是以这种方式引用的,但我不明白为什么。 – Haiyang 2011-02-01 13:43:04

由于您的变量不是static,因此ELF可以插入(想想LD_PRELOAD)。

我也有同样的困惑。 如果在两个DSO中定义了一个具有相同名称的全局变量,并且它们被动态链接到一个可执行文件中,那么这两个库是否会访问变量的相同副本? 变量所在的库(库的数据段)取决于库加载的顺序?