linux g ++将64位共享库代码链接到静态库

Gea*_*phy 9 linux 64-bit linker 32-bit g++

上下文:我可以创建一个链接到静态库的共享对象库,在32位linux上没有任何问题.当我在64位linux上尝试相同的构建时,我看到了这个链接器错误:

  • 在创建共享对象时,不能使用对"本地符号"的重定位R_X86_64_32S; 用-fPIC重新编译

这个错误在网上很常见.解决方案是使用位置无关代码(-fPIC)编译静态链接库.

我不明白为什么32bit版本不需要这样做.任何人都可以帮忙吗?

Gea*_*phy 4

好吧,答案在这里详细描述:http://www.technovelty.org/code/c/amd64-pic.html

解释的基本要点是 i386 体系结构隐式取消引用每个函数的帧指针(在链接页面的最后一段中进行了解释)。此过程会产生一些额外的开销,因此在新的 64 位架构中,这种取消引用的开销作为优化被消除了。

从链接的角度来看,这种优化的结果是,除非 64 位代码被显式编译为位置无关代码,否则它将生成带有其执行上下文偏移量的硬编码代码。

这是对链接页面内容的不完美解释,但足以满足我的目的。