Chinaunix
标题:
共享库的全局变量问题
[打印本页]
作者:
石下醉客
时间:
2015-08-13 21:18
标题:
共享库的全局变量问题
《程序员的自我修养》中动态链接关于共享库的问题看得有些糊涂了。
如果在某个共享库中定义了一个全局变量,在主模块即可执行文件中引用这个变量。比如
extern int global;
int main()
{
global = 2;
}
复制代码
按照书上的说法,程序主模块的代码不是地址无关代码,不会使用地址无关机制,它引用这个全局变量跟普通的数据访问方式一样,编译器会产生这样的代码:
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