我正在构建一个需要与位置无关的 iPhone 应用程序。我正在链接我没有源代码的第三方库。
如果这样的库没有用 -fPIC 编译,因此不是位置无关的,我仍然可以链接它以生成有效的 PIE 二进制文件吗?
动态加载器是否会处理由于此库中的代码而发生的任何文本重定位。
如果不是,我有什么可能的选择来解决这种情况并仍然生成 PIE 二进制文件?
据我所知,源文件是否构建-fPIC
并不重要,除非您打算从其目标文件中创建一个动态库。实际上,大多数静态库都不是以独立于位置的方式构建的。并不是说这会被禁止,但稍后会导致二进制文件更大更慢(因为编译器/链接器将无法执行某些类型的优化)。
并且二进制文件在它自己的地址空间中运行,它根本不必是位置独立的。这就是动态库必须与位置无关的原因,因为它们在不同的二进制文件之间共享,而这些二进制文件本身都需要不同的内存位置,因此动态链接器必须有可能在运行时将库移动到二进制文件的进程空间中的其他位置。
或者用更简单的话来说:只需链接到那个静态库,一切都会好起来的。