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
誰が何が問題なのか知っていますか?