Chinaunix

标题: 共享库的全局变量问题 [打印本页]

作者: 石下醉客    时间: 2015-08-13 21:18
标题: 共享库的全局变量问题
《程序员的自我修养》中动态链接关于共享库的问题看得有些糊涂了。
如果在某个共享库中定义了一个全局变量,在主模块即可执行文件中引用这个变量。比如
  1. extern int global;
  2. int main()
  3. {
  4.        global = 2;
  5. }
复制代码
按照书上的说法,程序主模块的代码不是地址无关代码,不会使用地址无关机制,它引用这个全局变量跟普通的数据访问方式一样,编译器会产生这样的代码:
movl $0x2 xxxxxxxx
其中xxxxxxx就是global的地址。由于可执行文件在运行时并不进行代码重定位,所以变量的地址必须在链接过程中确定下来。为了能使链接正常进行,链接器创建可执行文件时在.bss段创建一个global变量的副本。所有使用这个全局变量的指令都指向可执行文件中的副本,共享库默认把定义在模块内的全局变量当做定义在其他模块的变量,通过GOT间接引用。
这里我有些不理解,什么叫做“可执行文件在运行时不进行重定位”,如果可执行文件不进行重定位,那么可执行文件中调用属于共享库的函数怎么办,可执行文件不知道函数的具体地址(这在加载时才能知道),理论上应该通过PLT和GOT的跳转才能得到,如果不进行重定位,可执行文件怎么知道函数的地址呢?如果函数可以重定位,引用其他模块的全局数据为什么不能通过GOT重定位呢?
作者: MMMIX    时间: 2015-08-13 21:40
回复 1# 石下醉客


    自己有做过实验么?
作者: fender0107401    时间: 2015-08-14 08:44
我有个问题,全局变量这个东西,应该放在库里面吗?
作者: zsszss0000    时间: 2015-08-14 11:46
errno这个变量应该是放在库里面的吧。
所以我觉得可以放在库里面。回复 3# fender0107401


   
作者: MMMIX    时间: 2015-08-14 14:15
回复 4# zsszss0000


    能不能和应不应该是两回事.
作者: zsszss0000    时间: 2015-08-14 14:28
我觉得这种形式比较好
get_error_num(int * error_no)
回复 5# MMMIX


   
作者: lxy572535121    时间: 2015-08-14 17:13
这个研究清楚了有什么用?

作者: MMMIX    时间: 2015-08-14 17:29
回复 7# lxy572535121


    没什么用.

不过, 说起来也奇怪, 许多看起来没什么用的东西堆积多了, 却会产生大用.




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2