链接无法在macOS上运行的程序集文件

时间:2018-08-17 10:23:40

标签: macos assembly x86-64 yasm

我目前正在研究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

1 个答案:

答案 0 :(得分:1)

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

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

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