我在编译此 github repo for Super Mario 64 时遇到问题。我遵循了所有步骤。
make VERSION=us -j4
编译器做了它的事情并给出了一些预期的警告,但它没有给出任何错误并表示 sha1 校验和匹配。当我进入构建目录并尝试执行 sm64.us.bin 时,它给出了这个错误:bash: ./sm64.us.bin: cannot execute binary file: Exec format error
。当我搜索错误时,我发现有些人在尝试在 64 位操作系统上运行 32 位二进制文件时得到了它,但这不可能,因为我在 64 位机器上运行 64 位内核并编译它自己。我检查了权限位,那里似乎没有任何问题。我什至尝试删除 repo 并再次克隆它,但没有用。然后我尝试运行不同的标志,如 -j5 或完全不使用 -j 标志(这应该没什么区别,因为我运行的是相当快的 12 核 Ryzen 5,但我想我会尝试在单核上编译 GCC因为我的想法已经用完了)。我在这里做错了什么?我应该更改 GCC 的设置还是 makefile 有问题?
我检查了 ELF 文件,由于某种原因,它看起来像是 32 位。我运行了 file sm64.us.elf
,输出为 sm64.us.elf: ELF 32-bit MSB executable, MIPS, MIPS-III version 1 (SYSV), statically linked, not stripped
。海湾合作委员会为什么要这样做?如何编译 64 位可执行文件?
答案 0 :(得分:0)
GCC 可以构建 32 位或 64 位可执行文件(在大多数系统上)。这一切都取决于你给出的论据。如果您查看 make 正在运行的编译调用,您可能会看到它传递了 -m32
(或一些类似的)选项,它告诉编译器和链接器创建 32 位对象和二进制文件。
如果您想构建 64 位,则必须在您的 makefile 或其他配置中找到选择 32 位的参数,然后删除它们(或更改它们以明确选择 64 位)。
我应该警告你,这几乎肯定行不通!!并不是任何旧的 C 程序都可以编译为 32 位或 64 位并继续以相同的方式工作。这是可能,但是这样做需要程序员仔细并有远见地编写他们的代码。根据我的经验,视频游戏程序几乎总是专门针对给定的硬件目标进行编码,很少考虑使其可移植到其他硬件,包括“同一”供应商的 64 位版本。
与其尝试为 64 位构建代码,更好地利用您的时间是调查为什么您的系统无法运行 32 位可执行文件并修复它。对我来说很奇怪,您可以为 32 位编译但不能运行 32 位:通常,如果您可以构建它,那么您就安装了适当的库等来运行。