【发布时间】:2020-07-04 07:25:41
【问题描述】:
我学习汇编语言,我使用“nasm”将名为“my_program”的 .asm 文件编译为 .o 文件,此处使用此命令:
nasm -f elf32 my_program.asm -o my_program.o
就我而言,这可以正常工作,因为创建了一个 .o 文件。然后我执行以下命令:
ld my_program.o -o my_program
没有像它应该的那样创建一个 unix 可执行文件,而是出现了这个警告/错误:
ld: warning: platform not specified
ld: warning: -arch not specified
ld: warning: No platform min-version specified on command line
ld: warning: ignoring file my_program.o, building for -unknown but attempting to link with file built for unknown-unsupported file format ( 0x7F 0x45 0x4C 0x46 0x01 0x01 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 )
Undefined symbols for architecture unknown:
"_main", referenced from:
implicit entry/start for main executable
ld: symbol(s) not found for architecture unknown
有人知道为什么会这样吗?如果有帮助,这是 .asm 文件中的汇编代码(我只是在学习教程):
global _start
_start:
mov eax, 1
mov ebx, 42
int 0x80
【问题讨论】:
-
您的教程适用于 GNU/Linux,它使用 ELF 目标文件而不是
macho,并且系统调用 ABI 略有不同。查找 Mac 教程或在虚拟机中的实际 Linux 上运行它。 当您仍在尝试从中学习超级基础知识时,请勿尝试将您的教程移植到 MacOS。 -
这段代码是 32 位 Linux 代码,它在寄存器中传递参数。 32 位 MacOS/reeBSD 使用堆栈。 MacOS 工具链使用 Macho(对于 32 位 Mach,它是 Macho32),而不是 elf。如果您将
-f macho32与 NASM 一起使用而不是-f elf32会发生什么。也有可能您使用的 MacOS 甚至不再支持直接创建或运行 32 位程序。如果您使用的是 MacOS Catalina 或更新的操作系统,就会出现这种情况。 -
啊,我明白了! elf32 和 macho32 有什么区别?另外,如果 Mac 不支持 32 位程序,那么标志会是 macho64 吗?
-
如果在仅 64 位系统上,您必须使用 macho64 并使用正确的 64 位调用约定进行系统调用。 idryman.org/blog/2014/12/02/writing-64-bit-assembly-on-mac-os-x
-
去寻找 MacOS 的 64 位 NASM 教程并使用它。我忘记了stackoverflow.com/tags/x86/info 是否列出了任何内容;如果你找到一个好的,请告诉我。 (虽然要注意 MacOS 上的 NASM 错误 (this answer mentions both recent well-known ones);
as和.intel_syntax noprefix可能是更好的选择)。它将具有用于组装和链接的正确命令。就像我说的,在你已经学会了它试图教授的大部分内容之前,不要尝试将 32 位 Linux 教程移植到 MacOS。然后希望它不会有问题。
标签: macos assembly compilation nasm ld