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
[rel ...]
そのため、 nasm 構文を使用して RIP 相対アドレス指定を使用するようにコードを変更すると、警告は消えますが、実行可能ファイルでセグメント フォールトが発生するようになりました。
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
誰が何が問題なのか知っていますか?