我試圖讓在OSX的x86-64彙編代碼基本printf
例如尋址,這是我的第一個版本:使用RIP相對在OSX 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
轉換爲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
有誰知道發生了什麼問題?
同樣爲GAS:http://stackoverflow.com/questions/3250277 /如何在-64位彙編程序中使用rip-relative-addressing- –