【问题标题】:Why is there and error/warning when compiling .o file using ld command on mac?为什么在mac上使用ld命令编译.o文件时出现错误/警告?
【发布时间】: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


【解决方案1】:

_start 函数更改为_main,链接器需要_main 函数,就像C++/C 需要int main() for .cpp/.c 一样

global _main
_main:
    mov eax, 1
    mov ebx, 42
    int 0x80

【讨论】:

  • 您已经在 MacOS 上使用 nasmld 命令进行了测试? OP 使用的是nasm -felf32,这在需要 Mach-O 目标文件的 MacOS 上可能会出现问题。此外,IIRC MacOS 的 32 位 int 0x80 系统调用 ABI 与 FreeBSD 相匹配 - 它需要堆栈上的参数,从 [esp+4] 开始。因此,如果您确实获得了此链接,它可能会正确退出,但它会_exit(argc) 而不是代码所要的_exit(42)
猜你喜欢
  • 2013-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-27
  • 2015-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多