0

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」と呼ばれる特別なリンカーを使用していると思います。私の質問は:

  1. PAGEZEROからの読み取りが原因で、実際に私のエラーが発生しましたか。
  2. その場合、リンカ (ld) に PAGEZERO を正しいサイズで定義するように指示できますか?
4

1 に答える 1

1

解決済み: リンク コマンドを次のように変更しました。

ld memory.o -macosx_version_min 10.12 -lSystem -o メモリ

これは PAGEZERO サイズを変更しないため、どのように修正されたかはわかりませんが、現在は機能しています。

于 2016-11-09T16:42:45.507 に答える