【发布时间】:2021-05-19 14:33:01
【问题描述】:
我在 Ubuntu 20.04 上将 32 位应用程序转换为 64 位。能够在 RedHat(实际上是 Amazon Linux)系统上构建和运行它,但是当我尝试在 Ubuntu 上以 64 位模式编译它时,我从链接器收到此错误(在 32 位模式下工作正常):
/usr/bin/ld: /u/apps/lib/libiodbc.a(connect.o): relocation R_X86_64_32 against symbol `iodbcdm_global_lock' can not be used when making a PIE object; recompile with -fPIE
libiodbc.a 是我从 OpenLink 预编译的 odbc 驱动程序加载程序的一个版本(因为我找不到 32 位版本的包)。 Openlink 给了我 32 位和 64 位版本。没有重新编译它,但它可以在 RedHat 上运行 - 只是不是 Ubuntu。该库的 32 位版本在 Ubuntu 上可以正常链接。
RedHat 上是否有一些设置将所有编译默认为“与位置无关的可执行文件”模式,而在 Ubuntu (20.04) 上该设置不同?我想我可以回去并将 -fPIE 添加到我的全局编译器标志中(这会解决这个问题吗?),但我想知道为什么 Ubuntu 会抱怨而 RedHat 没有。
另外,我以前使用过 -fPIC 来处理共享库,但从未使用过 -fPIE。如果我用 -fPIE 构建所有东西,-fPIC 是多余的吗?
【问题讨论】: