EAX_BAD_ACCESS
インライン アセンブリ コードでラベルを使用しようとするとすぐに、理解できないエラーのために、一致する asm ステートメントの直後にアプリがクラッシュします。
たとえば、次のコードを考えてみましょう。
asm volatile (
"myloop: \n"
:
:
:
);
このスニペットが常にクラッシュするのはなぜですか? gcc 4.2 で Xcode 4.3.1 を使用しています。
問題は、Apple ツールチェーンのリンカーにあります。私もこの問題に直面しました。リンカーは、生成されたアセンブリから任意のラベルを取得し、それが関数の開始であると想定し、ラベルから始まるセクションを再配置します。これにより、一部のコードが関数のエピローグなしで切り捨てられ、PC が孤立したままになり、次のアドレスにあるセクション/関数/ルーチンにドリフトします。リンカーはローカル ラベルを 2 つの方法で認識します (リバース エンジニアリングから理解できるように)。 1. ラベル名の先頭に大文字の「L」を使用します。これは、コンパイラが独自のローカル ラベル (ループなど) をマークする方法です。2. 「0:」などの数値ラベルを使用し、前方ジャンプには「b 0f」、後方ジャンプには「b 0b」などの方向分岐を使用します。したがって、問題の解決策: asm volatile ( "Lmyloop: \n" : : : );
または asm volatile ( "0: \n"
: : : );