yasm アセンブラと ld リンカを使用するアセンブリ ブックに従っています。私は OSX 10.12 を使用しており、Mach-O 形式にアセンブルしようとしています。残念ながら、セグメンテーション違反が発生しています。これは元の .asm ファイルです。
BITS 64
segment .data
a dd 4
segment .bss
g resd 1
segment .text
global start
start:
push rbp
mov rbp, rsp
sub rsp, 16
xor eax, eax
leave
ret
私はそれをコンパイルします:
yasm -f macho64 -m amd64 -l メモリ.lst -o メモリ.o メモリ.asm
リンクします:
ld メモリ.o -o メモリ
lldb で実行すると、次のエラーが表示されます。
- スレッド #1: tid = 0xb3b4b、0x0000000000000001、停止理由 = EXC_BAD_ACCESS (コード = 1、アドレス = 0x1) フレーム #0: 0x0000000000000001 エラー: セクション __PAGEZERO からのデータ読み取りエラー
lldb で「ターゲット モジュール ダンプ セクション」を実行したところ、__PAGEZERO セグメントが次のように定義されていることがわかりました。
[0x0000000000000000-0x0000000000001000) --- メモリ.__PAGEZERO
clang でビルドされた通常の Mach-O バイナリを調べたところ、__PAGEZERO セグメントは次のようになっています。
[0x0000000000000000-0x0000000100000000) --- test.__PAGEZERO
その後、実際には PAGEZERO セグメントを作成するのはリンカーであることに気付きました。clang は「lld」と呼ばれる特別なリンカーを使用していると思います。私の質問は:
- PAGEZEROからの読み取りが原因で、実際に私のエラーが発生しましたか。
- その場合、リンカ (ld) に PAGEZERO を正しいサイズで定義するように指示できますか?