如题
自己尝试编译了几个简单程序,主程序中使用其他模块的函数与变量在编译过程之后的.o文件中,都是在等待重定位的状态,并没有变量指向.bss。
在进一步gcc -o链接之后,主程序调用.so的函数是使用的foo@plt来跳转到实际函数地址;使用.so中的全局变量,指向了主程序的.bss的。
再结合《程序员的自我修养》里,提到“可执行文件在运行中并不进行代码重定位”的意思,是指foo@plt之类的jmp指令,不算重定位的代码么?
最早纠结的地方在于,主程序只要跨模块调用函数,无伦如何,在动态链接时都应要进行代码重定位;所以,书上提“可执行代码在运行时并不进行代码重定位”,进而跨模块调用的全局变量要放到主模块的.bss中把我搞蒙了。
所以,我想搞明白两件事情:
- 共享模块的全局变量存放至主程序的.bss原因,是不是因为“可执行代码在运行时并不进行代码重定位”;还是考虑全局变量冲突等原因,或两者都有。
- 如果说上一个问题是因为“可执行代码在运行时并不进行代码重定位”,那这种将跳转代码放到foo@plt的行为实际上不属于代码重定位么?