32位gcc和带有-m32选项的64位gcc之间有什么区别?

5

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

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

在编译C语言代码时,使用gcc_32_bit temp.cgcc_64_bit -m32 temp.c有什么区别吗?

测试情况:

情况1:在64位ubuntu上使用gcc temp.c编译代码。输出结果:在64位ubuntu上long=8

情况2:在64位ubuntu上使用gcc -m32 temp.c编译代码。输出结果:在64位ubuntu上long=4

情况3:在64位MAC上(使用64位交叉编译器)使用/usr/local/gcc-4.8.1-for-linux64/bin/x86_64-pc-linux-gcc temp.c编译代码。输出结果:在64位ubuntu上long=8

案例4:使用32位交叉编译器在64位MAC上编译代码,命令为/usr/local/gcc-4.8.1-for-linux32/bin/i586-pc-linux-gcc temp.c输出:无法在64位ubuntu上运行

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


你不能在虚拟机中运行一个32位的Linux实例吗? - GoBusto
1
也许通过使用“file <exe>”命令检查可执行文件的目标环境会有所帮助。 - nucleon
@GoBusto,设置需要一些时间。所以我们设法在MAC上获得了一个32位交叉编译器。 - Amber Beriwal
1
当您尝试运行交叉编译的二进制文件时,您收到的确切错误消息是什么?64位编译器构建32位二进制文件和32位编译器构建32位二进制文件的输出应该没有区别。一个有趣的练习是对比两个不同二进制文件的反汇编,并将此信息包含在您的问题中。 - Cody Gray
你应该在编译命令中包含架构(例如 -arch i386 -arch x86_64)。此外,选择 -m32 并不一定限制编译器仅使用 i386 上可用的指令。选择 -march=i386 才会限制编译器,而默认的 -march 选项取决于编译器构建时的配置。 - l'L'l
Ubuntu的安装可能缺少Mac上交叉编译的32位程序所需的动态链接库。请参见https://dev59.com/1ZTfa4cB1Zd3GeqPQ3Ju - amdn
1个回答

0

这可能看起来有点奇怪,但它突然间开始工作了。

正如amdn在上面的评论中所提到的,这可能是由于缺少32位库。由于之前没有工作,我安装了gcc-multilib和一些Ubuntu的自动更新,现在它已经开始工作了。

感谢大家的帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接