macos - 基本程序集不能在Mac(x86_64 + Lion)上运行?

标签 macos assembly x86-64 system-calls

这是代码(exit.s):

.section .data,
.section .text,
.globl _start
_start:
    movl $1, %eax
    movl $32, %ebx
    syscall


当我执行" as exit.s -o exit.o && ld exit.o -o exit -e _start && ./exit"

返回值为“总线错误:10”,“ echo $?”的输出为138

我还尝试了以下有关此问题的正确答案的示例:Process command line in Linux 64 bit

stil得到“总线错误” ...

最佳答案

首先,您在Mac OS X上使用了旧的32位Linux内核调用约定-这绝对不起作用。

其次,Mac OS X中的syscall具有不同的结构-它们都具有前导类标识符和syscall号。该类可以是Mach,BSD或其他类(请参见XNU源文件中的here),并向左移动24位。普通的BSD系统调用具有类2,因此从0x2000000开始。类0中的系统调用无效。

根据SysV AMD64 ABI的§A.2.1,以及紧随其后的Mac OS X,系统调用ID(以及其在XNU上的类!)将移至%rax(或%eax,因为XNU的高32位未使用)。第一个参数放在%rdi中。接下来进入%rsi。等等。 %rcx被内核使用,并且其值被破坏,这就是为什么libc.dyld中的所有函数在进行系统调用之前将其保存到%r10中的原因(类似于kernel_trap中的syscall_sw.h宏)。

第三,Mach-O二进制文件中的代码段被称为__text,而不是Linux ELF中的.text,并且也驻留在__TEXT段中,统称为(__TEXT,__text)nasm会根据需要自动翻译.text如果选择了Mach-O作为目标对象类型)-请参见Mac OS X ABI Mach-O File Format Reference。即使正确安装了说明,将它们放在错误的段/节中也会导致总线错误。您可以使用.section __TEXT,__text指令(有关指令语法,请参见here),也可以使用(更简单的).text指令,或者可以将其完全删除,因为假定没有提供-n选项。到as(请参见as的联机帮助页)。

第四,Mach-O ld的默认入口点称为start(尽管您已经知道了,可以通过-e链接器选项对其进行更改)。

鉴于以上所有内容,您应该将汇编源代码修改如下:

; You could also add one of the following directives for completeness
; .text
; or
; .section __TEXT,__text

.globl start
start:
    movl $0x2000001, %eax
    movl $32, %edi
    syscall


在这里,按预期工作:

$ as -o exit.o exit.s; ld -o exit exit.o
$ ./exit; echo $?
32

关于macos - 基本程序集不能在Mac(x86_64 + Lion)上运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11179400/

相关文章:

c++ - 内联汇编跳转到标签

c - 如何动态生成 X86_64 以返回相对于 RIP/RBP 的值

c - 这个 128 位整数乘法在汇编 (x86-64) 中如何工作?

iphone - cocoa 中的 'variable' .text 相当于什么?

objective-c - NSPopUpButton、绑定(bind)和缩短的生命周期

c++ - OS X cmake 链接 stdlibc++,mongodb c++ 驱动程序问题

assembly - 有没有办法以编程方式获取当前系统上存在的所有 BIOS 中断列表?

macos - 使用 NSView 图层作为另一个 NSView 的 mask ,并仍然显示它

c - 什么 C 源代码将编译为针对 GOT 中另一个指针的调用 *get_func@GOTPCREL(%rip) 和 cmp?

linux - 在 Debian 上链接依赖于位置的程序集