2012-09-09 67 views
4

我試圖讓在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 

有誰知道發生了什麼問題?

+0

同樣爲GAS:http://stackoverflow.com/questions/3250277 /如何在-64位彙編程序中使用rip-relative-addressing- –

回答

5

問題是原始的mov rdi, msg在彙編時將內存地址msg加載到rdi

當它被變更爲mov rdi, [rel msg],這產生碼中使用的值中msg作爲相對地址,如在調試時看到:

Program received signal EXC_BAD_ACCESS, Could not access memory. 
Reason: KERN_INVALID_ADDRESS at address: 0x00000a6f6c6c6568 

通知的地址是如何包含從msg0x00000a<olleh>字節。

正確的解決辦法是使用lea指令在運行時加載的msg有效RIP-相對地址,像這樣:

lea rdi, [rel msg] 
+0

...並零終止您的字符串! –