【发布时间】:2011-10-21 04:02:31
【问题描述】:
如果要将目标文件作为共享库 (.so) 加载,则将代码编译到目标文件需要与位置无关,因为共享目标文件加载到不同的虚拟基地址过程可能不同。
现在,当我尝试在 32 位 x86 计算机上加载未使用 -fpic GCC 选项编译和链接的 .so 文件时,我没有遇到错误,而在 64 位 x86 计算机上却失败了。
我发现的随机网站说我不需要在 32 位上使用 -fpic,因为没有 -fpic 编译的代码在以与位置无关的方式使用时也符合 X86 32 位 ABI 的巧合。但我仍然发现软件在 32 位版本中附带不同版本的库:一个用于 PIC,一个用于非 PIC。例如,英特尔编译器附带libirc.a 和libirc_pic.a,后者被编译为与位置无关的模式(如果想将.a 文件链接到.so 文件中)。
我想知道对于 32 位代码,使用 -fpic 和不使用它之间的确切区别是什么,以及为什么某些软件包(例如 intel 编译器)仍然附带不同版本的库?
【问题讨论】:
-
您是否尝试过使用 TLS 对代码进行非-fpic 编译?或者加载几个内存范围重叠的非图片库?单独的静态库将静态链接到程序(libirc.a;没有图片更快一点)和静态链接到 .so 库(_pic.a 版本)。
标签: c linux shared-libraries elf pic