我试图printf
在 OSX 的 x86-64 汇编代码中制作一个基本示例,这是我的第一个版本:
section .data
msg db 'hello', 0Ah
section .text
extern _printf
global _main
_main:
sub rsp, 8
mov rdi, msg
mov rax, 0
call _printf
add rsp, 8
ret
因此,这段代码将第一个参数的绝对地址移动msg
到,然后 gcc 抱怨缺少与位置无关的代码。二进制文件仍然有效:rdi
_printf
→ nasm -f macho64 new.asm && gcc -m64 -o new new.o && ./new
ld: warning: PIE disabled. Absolute addressing (perhaps -mdynamic-no-pic) not allowed in code signed PIE, but used in _main from new.o. To fix this warning, don't compile with -mdynamic-no-pic or link with -Wl,-no_pie
hello
因此,当我使用 nasm 语法更改代码以使用 RIP 相对寻址时,[rel ...]
警告消失但可执行文件现在出现段错误:
section .data
msg db 'hello', 0Ah
section .text
extern _printf
global _main
_main:
sub rsp, 8
mov rdi, [rel msg]
mov rax, 0
call _printf
add rsp, 8
ret
当我编译并运行它时:
→ nasm -f macho64 new.asm && gcc -m64 -o new new.o && ./new
zsh: segmentation fault ./new
有谁知道出了什么问题?