【发布时间】: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.c和gcc_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