首页 文章

希望在内存级别很好地理解共享库

提问于
浏览
2

请有人帮忙 . 我正在创建一个共享库,当使用此命令运行时,会出现错误“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 回答

  • 1

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

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

    似乎是类似帖子的重复GCC -fPIC option

  • 1

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

    • 只读 .

    • 能够映射到进程的地址空间中的任意位置 .

    后果:

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

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

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

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

相关问题