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

时间:2012-02-11 03:20:59

标签: gcc dll shared-libraries static-libraries

请有人帮忙。 我正在创建一个共享库,当使用此命令运行时,这会产生错误 “gcc -shared libx.o -o libx.so”

/usr/lib64/gcc/x86_64-suse-linux/4.3 /../../../../ x86_64-suse-linux / bin / ld:libx.o:针对`.rodata重新定位R_X86_64_32 '制作共享对象时不能使用; 用-fPIC重新编译 libx.o:无法读取符号:错误值

collect2:ld返回1退出状态

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

非常感谢。

2 个答案:

答案 0 :(得分:1)

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

您可以阅读drepper,以便更好地了解动态关联http://www.akkadia.org/drepper/dsohowto.pdf

似乎是类似帖GCC -fPIC option

的重复内容

答案 1 :(得分:1)

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

  1. 只读。
  2. 能够映射到进程的地址空间中的任意位置。
  3. 后果:

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

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

    3. 现在我们可以理解你的问题了:

      重定位R_X86_64_32对`.rodata' - 此处链接器警告您编译器已使用受约束的codgen运行到低范围的地址。因此,它不适合在共享库中使用。