PIE禁用.在mac OS X上使用gcc进行asm编程时的绝对寻址

shr*_*wea 5 macos assembly gcc

我写了这段代码.我想在Mac OS X上通过gcc编译它.但它看起来'PIE禁用了.当我运行gcc时,绝对寻址.

我用Google搜索,但我找不到解决方案.请建议我.

hello.s

.data
hello: .string "Hello World!\n"

.text
.globl _main

_main:
    push %rbp
    mov %rsp, %rbp
    movabs $hello, %rdi
    call _printf
    leave
    ret
Run Code Online (Sandbox Code Playgroud)

错误

ld: warning: PIE disabled. Absolute addressing (perhaps -mdynamic-no-pic) not allowed in
code signed PIE, but used in _main from /var/folders/xs/4z9kr_n93111fhv9_j1dd9gw0000gn/T/ex2_64-369300.o. 
To fix this warning, don't compile with -mdynamic-no-pic or link with -Wl,-no_pie
Run Code Online (Sandbox Code Playgroud)

Chr*_*ris 4

看起来有几个解决方案:

  1. 与 -Wl,-no_pie 链接:
clang -o hello hello.s -Wl,-no_pie
Run Code Online (Sandbox Code Playgroud)
  1. 不要使用绝对寻址。
.data
hello: .string "Hello World!\n"

.text
.globl _main

_main:
    push %rbp
    mov %rsp, %rbp
    lea hello(%rip), %rdi
    mov $0, %rax
    call _printf
    leave
    ret
Run Code Online (Sandbox Code Playgroud)

然后就可以编译并运行:

host % clang -o hello hello.s            
host % ./hello 
Hello World!
Run Code Online (Sandbox Code Playgroud)

System V 应用程序二进制接口的 3.5.7 节中提到了有关将 al 清零的部分。以下是相关摘录:

当调用带有变量参数的函数时,%al 必须设置为向量寄存器中传递给函数的浮点参数总数。

在你的情况下,这是零。您正在传递零浮点参数。