【问题标题】:Linking assembly files not working on macOS链接程序集文件在 macOS 上不起作用
【发布时间】:2018-08-17 10:23:39
【问题描述】:

我目前正在学习 X86_Intel 64 位汇编,我想在 macOS 上运行我的汇编代码。我的代码在 Ubuntu VM 上正确编译和链接:

 yasm -f elf64 -g dwarf2 -l div.lst div.asm 
 ld -o div div.o

但是,当我使用上述相同的命令时,我在 macOS 上遇到了问题。有什么明显我遗漏的东西吗?

Jonathans-MacBook-Pro:Practical 2 jonathancopeland$ yasm --version
yasm 1.3.0
Compiled on Sep 15 2017.Copyright (c) 2001-2014 Peter Johnson and other Yasm developers.
Run yasm --license for licensing overview and summary.
Jonathans-MacBook-Pro:Practical 2 jonathancopeland$ yasm -f elf64 -g dwarf2 -l div.lst div.asm
Jonathans-MacBook-Pro:Practical 2 jonathancopeland$ ld -o div div.o
**ld: warning: -arch not specified
ld: warning: -macosx_version_min not specified, assuming 10.11ld: warning: ignoring file div.o, file was built for unsupportedfile format ( 0x7F 0x45 0x4C 0x46 0x02 0x01 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 ) which is not the architecture being linked (x86_64): div.o
Undefined symbols for architecture x86_64:
  "start", referenced from:
 implicit entry/start for main executable
ld: symbol(s) not found for inferred architecture x86_64
Jonathans-MacBook-Pro:Practical 2 jonathancopeland$**

Here is a screenshot of my code, file structure and terminal

【问题讨论】:

  • 函数名称在 macOS 上用前导下划线修饰。另外,请勿发布代码图片。始终将代码作为文本发布!请更新您的帖子以将您的所有代码粘贴到问题中。一旦你这样做,我就会撤回我的反对票。
  • OS X 使用macho64,而不是elf64
  • 所以你在 VM 中运行 Mac OS X? (那么关于 Ubuntu 的信息并不真正相关,只会在 VM 本身中遇到一些奇怪的错误)。您是否在 Mac OS 上的 VM 中运行 Ubuntu? (那么关于 Mac 的信息是不相关的,因为你在 VM 中的代码将在 linux 上运行,而不是在 mac 上)。通过快速阅读问题,我不清楚你想要实现什么以及你想要实现的目标。

标签: macos assembly x86-64 yasm


【解决方案1】:

首先,汇编代码通常不能在平台之间移植,即使在相同的 CPU 架构上也是如此。如果您确切地知道自己在做什么,则可以使您的汇编代码具有可移植性,但这需要对系统有很好的了解。

您的代码存在三个主要问题:

  1. macOS 不是 ELF 目标。你指示yasm 生成一个 macOS 链接编辑器不理解的 ELF 对象。您需要生成一个 Mach-O 对象才能成功创建二进制文件。有关如何执行此操作,请参阅您的汇编程序的文档。
  2. macOS 有一个不同的入口点默认名称,我认为它只是start。有关详细信息,请参阅链接编辑器的文档。
  3. 系统调用有不同的编号,有时也有不同的参数。有关详细信息,请参阅this list。使用 Linux 系统调用通常是行不通的。对于可移植的解决方案,请使用 libc 中的系统调用包装器,但请记住,macOS 上的符号用前导下划线装饰。例如,C 函数 write 的符号被命名为 _write

【讨论】:

  • nasm/gcc issue on 64-bit Mac OS X Lion 表示精灵与男子气概和前导下划线。但是,是的,因为第 3 点不是重复的:Linux 和 OS X 不兼容 asm。
  • @PeterCordes 我很确定我以前在某个地方看到过所有个别的 OPs 问题,但我不确定我是否在这个确切的组合中看到过。
猜你喜欢
  • 2018-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多