希望在内存级别对共享库有很好的理解



请有人帮忙。我正在创建一个共享库,当使用此命令运行时,会出现错误"gcc-共享libx.o-o libx.so"

//usr/lib64/gcc/x86_64-sus-linux/4.3/../../../../x86_64-sus-linux/bin/ld:libx.o:在创建共享对象时,不能使用针对".rodata"的重新定位R_x86_64_32;使用-fPIC重新编译libx.o:无法读取符号:值错误

collect2:ld返回1退出状态

所以,我用-FPIC运行它,它进行编译,请你能让我很好地理解-FPIC在内存级别的意义吗?我的意思是,它是如何在使用这个共享库的两个程序之间的物理内存中共享的。

非常感谢。

-fpic代表与位置无关的代码。

你可以阅读drepper来获得更多关于动态链接的想法http://www.akkadia.org/drepper/dsohowto.pdf

似乎是类似的后GCC-fPIC选项的重复

对于具有虚拟内存的系统,加载程序可能会将共享代码映射到使用该库的应用程序的内存空间中的一些连续页面中。为了在多个进程之间共享这些页面,它们必须是:

  1. 只读
  2. 能够映射在进程的地址空间中的任意位置

后果:

  1. 大多数代码都不是只读的,因为它不能直接映射到进程的内存空间并运行——它必须首先由加载程序以特定于每个进程的方式进行修改。为了实现只读文本,您将-fpic选项传递给编译器。这导致编译器生成不太理想的机器代码,但好处是它是只读的。

  2. 高效的代码通常不能映射到地址空间中的任意位置。通常有效的代码要么被限制到特定地址,要么被限制在低范围的地址。-fpic选项指示编译器使用效率较低的代码生成,但其好处是不受运行位置的限制。

现在我们可以理解您的问题:

针对".rodata"重新定位R_X86_64_32-此处链接器警告您,编译器已使用被限制在较低地址范围内运行的codgen。因此,它不适合在共享库中使用。

相关内容

最新更新