我试图在OSX上使用x86-64汇编语言制作一个基本的printf
示例,以下是我的第一版:
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
的绝对地址移动到rdi
中作为_printf
的第一个参数,然后gcc会抱怨缺少位置无关代码。但是二进制文件仍然可以正常工作:
→ 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
当我改变代码使用RIP相对寻址,使用[rel ...]
nasm语法时,警告消失了,但可执行文件现在会发生段错误:
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
有人知道出了什么问题吗?