Mach-O 64 位格式不支持 32 位绝对地址。国家安全管理协会

dan*_*pen 5 macos assembly x86-64 nasm

当我使用时nasm -f macho64 asm1.asm,出现以下错误:

asm1.asm:14: 错误:Mach-O 64 位格式不支持 32 位绝对地址

这是 asm1.asm

SECTION .data           ;initialized data

msg: db "Hello world, this is assembly", 10, 0

SECTION .text           ;asm code

extern printf
global _main

_main:
    push rbp
    mov rbp, rsp

    push msg
    call printf

    mov rsp, rbp
    pop rbp
    ret
Run Code Online (Sandbox Code Playgroud)

我对汇编真的很陌生,几乎不知道这些命令的作用。知道这里有什么问题吗?

Dre*_*wen 5

Mac OS X 与其他 UNIX/POSIX 系统一样,对 64 位代码使用不同的调用约定。相反,推动所有参数堆栈,它使用RDIRSIRDXRCXR8,和R9前6个论点。因此push msg,您需要使用类似mov RDI, msg.

  • 或者甚至更好,**使用 `lea rdi, [rel msg]`** 而不是具有 64 位绝对地址的 10 字节 `mov r64, imm64`。相对于 RIP 的 LEA 更小、更高效,并且与位置无关,因此如果操作系统想要在可执行文件上使用 ASLR,则不需要修复。 (2认同)

归档时间:

查看次数:

6794 次

最近记录:

5 年,4 月 前