强制 gcc 在64位平台上编译32位程序

我有一个专有的程序,我试图在64位系统上使用。

当我启动安装程序时,它工作正常,但是在它尝试更新自己并编译一些模块之后,它就无法加载它们了。

我怀疑这是因为它正在使用 gcc 和 gcc 尝试为64位系统编译它们,因此这个程序不能使用这些模块。

是否有任何方法(一些环境变量或类似的东西)迫使 gcc 为32位平台做所有事情。一个32位的 chroot 可以吗?

86125 次浏览

您需要让 GCC 使用 -m32标志。

您可以尝试在 $PATH中编写一个简单的 shell 脚本,并将其命名为 GCC (确保不会覆盖原始的 GCC,并确保新脚本在 $PATH中出现得更早,并且它使用到 GCC 的完整路径。

我认为您需要的代码类似于 /bin/gcc -m32 $*,这取决于您的 shell ($*是用来包含所有参数的,尽管它可能是其他的东西——非常重要!)

应用 Alan Pearce 的方法,你可能会得到一个32位的二进制文件,但是你也可能会得到以下错误:

fatal error: bits/predefs.h: No such file or directory

如果是这种情况,并且您有 apt-get,那么只需安装 gcc-multilib 即可

sudo apt-get install gcc-multilib

对于任何直接使用 gcc/g++编译的代码,都需要在编译命令行中添加 -m32选项,只需在 Makefile中编辑 CFLAGSCXXFLAGSLDFLAGS变量即可。

对于可能使用的任何第三方代码,必须确保在构建时配置它以进行交叉编译。运行 ./configure --help并查看哪个选项可用。在大多数情况下,你可以向配置脚本提供你的 CFLAGSCXXFLAGSLDFLAGS变量。你可能还需要在配置脚本中加入 --build--host,这样你就会得到类似

./configure CFLAGS=-m32 CXXFLAGS=-m32 LDFLAGS=-m32 --build=x86_64-pc-linux-gnu --host=i686-pc-linux-gnu

如果编译失败,这可能意味着您需要在64位机器上安装一些32位开发包