共享库文件内的地址是虚拟地址还是可重定位地址?

共享库文件内的地址是虚拟地址还是可重定位地址?

共享库文件内的地址是虚拟地址还是可重定位地址?

答案是否取决于共享库文件是否是使用 GCC 的 -fPIC 选项构建的?

来源于 共享对象文件和可重定位文件有什么区别?

答案1

进程获得虚拟地址空间。 ELF 文件指定一个虚拟地址,以将包含共享对象的部分内容加载到该虚拟地址空间中。这些将是虚拟地址。

节具有指向位置相关的地址的重定位表,这些地址在加载时的重定位期间得到纠正,这有多种原因,但如果该节中的所有地址都可以重定位到该节,那么它是可重定位的,这就是生成 ELF 的目标可重定位文件,然后可以用作创建可执行文件或共享对象的输入。

共享库是 ELF 共享对象的上一层,是操作系统加载时动态链接器的函数。它将重新映射进程虚拟内存空间中的重定位地址。因此共享库既有可重定位段又有虚拟地址。将它们称为可重定位地址是一种误导,因为它实际上是使地址可重定位的代码段和关联的重定位表。

GCC -fPIC创建与位置无关的代码,从而无需重新定位。从功能上讲,ELF 可重定位文件中可以包含位置相关或独立的代码。

相关内容