我在编译这个github repo for Super Mario 64时遇到了问题。我遵循了所有的步骤。
- 我确保我已经安装了所有的依赖项,比如build essential
- 我克隆了回购系统复制了一个rom用来提取资产
- 我通过运行
make VERSION=us -j4
使用了Makfile
编译器做了它的事情,并给出了一些警告,这是可以预期的,但它没有给予任何错误,并说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
。为什么GCC要这样做?我如何编译64位的可执行文件?
2条答案
按热度按时间vc9ivgsu1#
GCC可以构建32位或64位的可执行文件(在大多数系统上)。这完全取决于你给它给予什么参数。如果你看一下make正在运行的编译调用,你可能会看到它传递了
-m32
(或一些类似的)选项,它告诉编译器和链接器创建32位的对象和二进制文件。如果你想构建64位,你必须在makefile或其他配置中找到选择32位的参数,并删除它们(或将它们改为显式选择64位)。
我应该警告你,* 这几乎肯定不会工作!!* 任何旧的C程序都不能被编译为32位或64位并继续相同地工作。这是 * 可能的 *,但这样做需要程序员仔细地编写代码,并有先见之明。根据我的经验,视频游戏程序几乎总是针对给定的硬件目标专门编写,很少考虑使其可移植到其他硬件,包括64位版本的“同一”供应商。
与其试图为64位编译代码,更好地利用你的时间是调查为什么你的系统不能运行32位的可执行文件并修复它。对我来说,你可以为32位编译但不能运行32位是很奇怪的:通常如果你可以编译它,那么你已经安装了适当的库等来运行。
aurhwmvo2#
把一个sm64 rom(美国)在这文件夹.如果它的HackerSM64,命名它baserom.us.z64.如果它的正常分解.命名它baserom.us
编辑:它会在[黑客文件夹]\build\sm64.z64