些細なmacOSアセンブリ64ビットプログラムのスタックアライメントが正しくない

セルゲイ

引数付きの簡単なコンソールアセンブリプログラムを作成しようとしています。コードは次のとおりです。

.section __TEXT,__text

.globl _main

_main:

    movl    $0, %edi
    callq   _exit

コンパイルとリンクのスクリプトは次のとおりです。

as test.s -o test.o
ld test.o -e _main -o test -lc 

これで、引数の数に応じて、プログラムがセグメンテーション違反で失敗するか、エラーなしで実行されます。

$ ./test
Segmentation fault: 11
$ ./test 1
$ ./test 1 2
$ ./test 1 2 3
Segmentation fault: 11
$ ./test 1 2 3 4
$ ./test 1 2 3 4 5
Segmentation fault: 11

等々。

LLDBの下に、より有益なエラーが表示されます。

Process 16318 stopped
* thread #1, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=EXC_I386_GPFLT)
    frame #0: 0x00007fffad14b2fa libdyld.dylib`stack_not_16_byte_aligned_error
libdyld.dylib`stack_not_16_byte_aligned_error:
->  0x7fffad14b2fa <+0>: movdqa %xmm0, (%rsp)
    0x7fffad14b2ff <+5>: int3   

libdyld.dylib`_dyld_func_lookup:
    0x7fffad14b300 <+0>: pushq  %rbp
    0x7fffad14b301 <+1>: movq   %rsp, %rbp

実際、プログラムの最初の行で実行を停止すると、スタックはある引数カウントに対して16バイトに整列されていないのに対し、別の引数カウントに対しては整列されていることがわかります。が、AMD64用のSystem V ABIは、と述べています:

スタックポインタは、スタックの一部である最下位アドレスを持つバイトのアドレスを保持します。プロセスエントリで16バイトに整列されることが保証されています。

何が足りないのですか?

fuz

OS Xでは、カーネルはへのエントリ時にスタックの配置を保証しないと思いますmainスタックを手動で整列させる必要があります。幸い、これはかなり簡単で、スタックポインタの少なくとも4ビットをゼロにするだけです。引数ベクトルまたはその他のデータをフェッチする必要がある場合は、必ず元のスタックポインタを次の場所に格納してください。

_main:
    mov %rsp,%rax    # copy original stack pointer
    and $-16,%rsp    # align stack to 16 bytes
    push %rax        # save original stack pointer
    push %rbp        # establish...
    mov %rsp,%rbp    # ...stack frame
    ...              # business logic here
    leave            # tear down stack frame
    pop %rsp         # restore original stack pointer
    ...              # exit process

また、スタックの配置を精神的に追跡する必要があります。main通常のスタックフレームを使用できるように、スタックの配置を行ってから実際のメイン関数を呼び出すだけの方が簡単な場合があります。

_main:
    mov %rsp,%rbx    # save original stack pointer
    and $-16,%rsp    # align stack to 16 bytes
    call _my_main    # call actual main function
    mov %rbx,%rsp    # restore original stack pointer
    ...              # exit process

特定のサンプルプログラムでは、次の最小限のコードを使用できます。

_main:
    and $-16,%rsp    # align stack to 16 bytes
    xor %edi,%edi    # set exit status to zero
    call _exit       # exit program

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

32ビットプロセッサでアセンブリラベルアドレスが正しくない

分類Dev

Windows64ビットプログラムが正しくインストールされていない

分類Dev

switchステートメントがC ++プログラムでアスタリスクを正しく出力しないのはなぜですか?

分類Dev

64ビットLinuxで32ビットat&tアセンブリプログラムをコンパイルしても機能しない

分類Dev

フラグメントのBeanプリプロセッサがフォームオブジェクトを正しく処理しない

分類Dev

簡単なWCFプログラム、クライアントプログラムでサービスメソッドが機能しない

分類Dev

ブートストラップグリッドアイテムが正しくレンダリングされない

分類Dev

ブートストラップが正しく参照されているのに、カメラとビデオのアイコンが表示されない

分類Dev

ブートストラップ入力グループがjQueryUIダイアログ内で正しくレンダリングされない

分類Dev

ブートストラップ入力グループがjQueryUIダイアログ内で正しくレンダリングされない

分類Dev

ブートストラップアコーディオンクリックイベントが動的データで正しく機能しない

分類Dev

Javaインスタントメッセンジャー-ログインフォームから起動したときにクライアントが正しく機能しない

分類Dev

ダイナミックHTMLロードでブートストラップマテリアルデザインが正しく機能しない

分類Dev

macOSタッチバーのコントロールストリップへのプログラム可能なアクセスはありますか?

分類Dev

PHPのセッションタイムアウトプログラムが機能しない

分類Dev

ブートストラップ 4 アルファ 6 ナビゲーションバーが Google クロームで正しく表示されない

分類Dev

Twilioの「プログラム可能なビデオ」JWTアクセストークンを正しく処理する方法は?(アンドロイド)

分類Dev

コーディングインタビューのクラッキング:再帰サブセットアルゴリズムがインデックスを減らすのではなく増やすのはなぜですか?

分類Dev

コーディングインタビューのクラッキング:再帰サブセットアルゴリズムがインデックスを減らすのではなく増やすのはなぜですか?

分類Dev

カスタムダイアログフラグメントのスタイリングが機能しない

分類Dev

Facebookログインメッセージ:「URLがブロックされました:リダイレクトURIがアプリのクライアントOAuth設定でホワイトリストに登録されていないため、このリダイレクトは失敗しました。」

分類Dev

Facebookログインメッセージ:「URLがブロックされました:リダイレクトURIがアプリのクライアントOAuth設定でホワイトリストに登録されていないため、このリダイレクトは失敗しました。」

分類Dev

ブートストラップダイアログプロンプト(フォーム)が機能しない

分類Dev

ランタイムライブラリを使用したDelphi64ビットデバッグで、アクティブなスタックフレームが間違っています

分類Dev

リアクティブプログラミング(Reactor):なぜメインスレッドがスタックしているのですか?

分類Dev

Androidフラグメントのトップレベルのレイアウトにプログラムでアクセスできない

分類Dev

レプリカセットのプライマリメンバーまたはセカンダリメンバーもホストするシステムでアービターを実行しないでください

分類Dev

MapboxGLクライアントのセルフホストベクタータイルが正しくレンダリングされない

分類Dev

MapboxGLクライアントのセルフホストベクタータイルが正しくレンダリングされない

Related 関連記事

  1. 1

    32ビットプロセッサでアセンブリラベルアドレスが正しくない

  2. 2

    Windows64ビットプログラムが正しくインストールされていない

  3. 3

    switchステートメントがC ++プログラムでアスタリスクを正しく出力しないのはなぜですか?

  4. 4

    64ビットLinuxで32ビットat&tアセンブリプログラムをコンパイルしても機能しない

  5. 5

    フラグメントのBeanプリプロセッサがフォームオブジェクトを正しく処理しない

  6. 6

    簡単なWCFプログラム、クライアントプログラムでサービスメソッドが機能しない

  7. 7

    ブートストラップグリッドアイテムが正しくレンダリングされない

  8. 8

    ブートストラップが正しく参照されているのに、カメラとビデオのアイコンが表示されない

  9. 9

    ブートストラップ入力グループがjQueryUIダイアログ内で正しくレンダリングされない

  10. 10

    ブートストラップ入力グループがjQueryUIダイアログ内で正しくレンダリングされない

  11. 11

    ブートストラップアコーディオンクリックイベントが動的データで正しく機能しない

  12. 12

    Javaインスタントメッセンジャー-ログインフォームから起動したときにクライアントが正しく機能しない

  13. 13

    ダイナミックHTMLロードでブートストラップマテリアルデザインが正しく機能しない

  14. 14

    macOSタッチバーのコントロールストリップへのプログラム可能なアクセスはありますか?

  15. 15

    PHPのセッションタイムアウトプログラムが機能しない

  16. 16

    ブートストラップ 4 アルファ 6 ナビゲーションバーが Google クロームで正しく表示されない

  17. 17

    Twilioの「プログラム可能なビデオ」JWTアクセストークンを正しく処理する方法は?(アンドロイド)

  18. 18

    コーディングインタビューのクラッキング:再帰サブセットアルゴリズムがインデックスを減らすのではなく増やすのはなぜですか?

  19. 19

    コーディングインタビューのクラッキング:再帰サブセットアルゴリズムがインデックスを減らすのではなく増やすのはなぜですか?

  20. 20

    カスタムダイアログフラグメントのスタイリングが機能しない

  21. 21

    Facebookログインメッセージ:「URLがブロックされました:リダイレクトURIがアプリのクライアントOAuth設定でホワイトリストに登録されていないため、このリダイレクトは失敗しました。」

  22. 22

    Facebookログインメッセージ:「URLがブロックされました:リダイレクトURIがアプリのクライアントOAuth設定でホワイトリストに登録されていないため、このリダイレクトは失敗しました。」

  23. 23

    ブートストラップダイアログプロンプト(フォーム)が機能しない

  24. 24

    ランタイムライブラリを使用したDelphi64ビットデバッグで、アクティブなスタックフレームが間違っています

  25. 25

    リアクティブプログラミング(Reactor):なぜメインスレッドがスタックしているのですか?

  26. 26

    Androidフラグメントのトップレベルのレイアウトにプログラムでアクセスできない

  27. 27

    レプリカセットのプライマリメンバーまたはセカンダリメンバーもホストするシステムでアービターを実行しないでください

  28. 28

    MapboxGLクライアントのセルフホストベクタータイルが正しくレンダリングされない

  29. 29

    MapboxGLクライアントのセルフホストベクタータイルが正しくレンダリングされない

ホットタグ

アーカイブ