【问题标题】:What is difference between 32-bit gcc and 64-bit gcc with -m32 option?带 -m32 选项的 32 位 gcc 和 64 位 gcc 有什么区别?
【发布时间】:2017-09-22 02:45:06
【问题描述】:

我的团队最近一直在研究 JNI,因此我们在 32 位和 64 位架构方面遇到了不同的问题。举个例子(temp.c)。

#include <stdio.h>
void main(){
  printf("long=%d\n",sizeof(long));
}

gcc_32_bit temp.cgcc_64_bit -m32 temp.c有什么区别吗?

测试案例:

案例 1: 使用 gcc temp.c 在 64 位 ubuntu 上编译的代码。 输出: long=8 在 64 位 ubuntu 上。

案例 2: 使用 gcc -m32 temp.c 在 64 位 ubuntu 上编译的代码。 输出: long=4 在 64 位 ubuntu 上。

案例 3: 使用 /usr/local/gcc-4.8.1-for-linux64/bin/x86_64-pc-linux-gcc temp.c 在 64 位 MAC (64-bit cross compiler used) 上编译的代码。 输出: long=8 在 64 位 ubuntu 上。

案例 4: 使用 /usr/local/gcc-4.8.1-for-linux32/bin/i586-pc-linux-gcc temp.c 在 64 位 MAC (32-bit cross compiler used) 上编译的代码。 输出: Error: cannot run 在 64 位 ubuntu 上。

我们正在使用 MAC 交叉编译器,因为我们没有 32 位 linux 机器。

【问题讨论】:

  • 不能在虚拟机中运行 32 位 Linux 实例吗?
  • 也许它有助于使用'file '检查可执行文件的目标环境。
  • @GoBusto 实际上需要一些时间来设置。所以我们设法通过 MAC 获得了一个 32 位的交叉编译器。
  • 当您尝试运行交叉编译的二进制文件时收到的确切错误消息是什么?构建 32 位二进制文​​件的 64 位编译器的输出与构建 32 位二进制文​​件的 32 位编译器的输出之间应该没有区别。一个有趣的练习是对两个不同的二进制文件的反汇编进行比较,并将此信息包含在您的问题中。
  • 您可能应该在编译命令中包含架构(例如-arch i386 -arch x86_64)。此外,选择-m32 并不一定限制编译器仅使用i386 上可用的指令。选择-march=i386 确实会限制编译器,默认的-march 选项取决于编译器在构建时的配置方式。

标签: c macos ubuntu cross-compiling cpu-architecture


【解决方案1】:

这可能看起来有点奇怪,但它已经开始工作了。

正如amdn 在上面的 cmets 中发布的,这可能是由于缺少一些 32 位库。由于之前不工作,我安装了 gcc-multilib 和一些 Ubuntu 的自动更新,它已经开始工作了。

感谢大家的大力帮助。

【讨论】:

    猜你喜欢
    • 2012-12-09
    • 1970-01-01
    • 2013-01-11
    • 2010-12-17
    • 2014-02-05
    • 1970-01-01
    • 1970-01-01
    • 2013-10-23
    • 2010-12-01
    相关资源
    最近更新 更多