你能在 64 位机器上编译 32 位 Apache DSO(Oracle HTTP 服务器)吗?

Posted

技术标签:

【中文标题】你能在 64 位机器上编译 32 位 Apache DSO(Oracle HTTP 服务器)吗?【英文标题】:Can you compile 32-bit Apache DSOs (Oracle HTTP Server) on a 64-bit machine? 【发布时间】:2010-10-16 04:14:06 【问题描述】:

我已将 Oracle 数据库和 Oracle HTTP 服务器安装从 32 位机器迁移到 64 位机器 - 两台机器都运行 Linux。 Oracle 数据库是 64 位的,但 (Apache) HTTP 服务器是 32 位的。

我使用了一些非 Oracle DSO(一个是 mod_ntlm),但每当我运行标准的“make install”类型的东西时,我最终都会得到一个 64 位模块。

是否有在 64 位机器上编译 32 位 Apache 模块的标准方法?

【问题讨论】:

另见***.com/questions/1272357/… 【参考方案1】:

作为 Andrew Medico 回答的替代方案,在 PPC 或 SPARC 或 Intel 机器上使用 '-m32' 进行 32 位编译,使用 '-m64' 进行 64 位编译 - 因为您实际上并未提及哪个芯片您正在使用的架构,并且该符号适用于所有这些。

我经常使用:

CC="gcc -m32" ./configure

确保 32 位编译(或者,更常见的是 CC="gcc -m64" 确保 64 位编译)。


问题:“CC是make使用的环境变量吗?”

答案:是的,虽然在这种情况下,它也被configure 识别,这是一个由autoconf 生成的shell 脚本。我使用的符号 - 这是我在命令行中使用的 - 在运行 configure 命令时在环境中设置 CC。另一个答案建议使用:

./configure CC="gcc -m32"

我认为它可以工作并达到几乎相同的效果;没试过,不知道好不好用。

如果您运行./configure --help | less,您将看到有关如何使用该脚本的信息(通常只是标准信息)。最后,它会列出(一些)相关的环境变量,CC就是其中之一。

将 C 编译器设置为“gcc -m32”的好处是每次使用编译器时都会设置 32 位标志 - 出错的空间很小。如果您设置了一个标志变量(CFLAGS 等),则有可能某些命令不会使用它,然后事情可能会出错。

另外,回到问题,make 肯定使用了一个名为 CC 的变量(宏)。您可以在 make 命令行上进行设置:

make CC="gcc -m32"

这会覆盖 makefile 中的任何设置。相比之下,使用环境变量时,makefile 中的设置会覆盖环境中的值,因此将 CC 设置为环境变量的帮助较小。尽管make -e 将环境优先于makefile,但它通常是一个危险的选择——它可能会产生意想不到的副作用。

【讨论】:

【参考方案2】:
./configure CFLAGS="-march=i686" 

应该这样做

【讨论】:

【参考方案3】:

除了 gcc 中的 -m32 标志外,如果您同时拥有 32 位和 64 位库,您可能需要为 ld 包含 -melf_i386 标志才能将 32 位目标文件正确链接到 32 位库。 64 位 linux 机器上的标准 ld 将默认为 64 位库,并且在链接发生时会出现兼容性错误。

【讨论】:

以上是关于你能在 64 位机器上编译 32 位 Apache DSO(Oracle HTTP 服务器)吗?的主要内容,如果未能解决你的问题,请参考以下文章

在 32 位和 64 位上编译,但校验和不同

如何在 64 位 RHEL 上编译 32 位应用程序?

如何在 64 位 osx 上编译 gcc 32 位应用程序

在 64 位机器上编译 tcpsplice

在运行 64 位 linux 的 Armv8 (aarch64) 上编译并运行 32 位二进制文​​件

BFD_RELOC_64:使用 C++ 在 32 位 linux 上编译汇编器指令