iOSアプリケーションは、ThumbモードでApple LLVM 3.0コンパイラを使用してビルドされています。 armv7については、実際にはThumb-2であると確信しています。Xcode 4.2のiOSの逆アセンブリをThumbからARMに切り替える方法は?
私は、ARMアセンブリコードでもっとも時間のかかる2つの機能を再実装しています。これらの関数の呼び出し元はThumbなので、ARMのインターワーキング命令にThumbを使用して関数のプロローグでARMに切り替えるので、ARMの豊富な命令セットとより多くのレジスタにアクセスできます。関数exitでは、ARMとThumbのインターワーキングを使用してARMモードに戻ります。
GDBの逆アセンブリはThumbコードでは正しいですが、ARMモードでは、まったく無意味なThumb命令のペアのようにARM命令を逆アセンブルします。 GDBにARMの逆アセンブリに切り替えるよう指示することはできますか?その後、Thumbコードに戻ったときにThumb逆アセンブラを使用しますか?
Googleは役に立ちません。明らかに、GDBの他のフォークがありますが、GDBでそれを行う方法を考え出していません。
LLDBは明らかにARMデバッグをサポートしていますが、Xcode 4.2のiOSデバイスではまだ動作しません。 [製品] - > [Edit Scheme]でLLDBデバッガを選択し、コードにブレークポイントを設定すると、ブレークポイントに達する前にアプリケーションがハングします。
私はあらゆる種類のアセンブリを行って以来、ずっと時間がかかりました。したがって、さまざまなパラメータを取り、さまざまなタイプの結果をCおよびARMアセンブリで返す関数を実装することで、ARM呼び出し規約をブラッシュアップしています。 lower_case関数はCで、CamelCase関数はassemblyです。私はそれがここでYES
BOOL abiTest(void)
{
void_no_args();
VoidNoArgs();
if (42 != int_no_args())
return NO;
if (42 != IntNoArgs())
return NO;
return YES;
}
を返しIntNoArgsための源であることを保証するために)()(メインから非常にまず最初abiTestを呼び出し、アサートを使用しています。 .thumb_funcはリンカのディレクティブです。 1は、ここでは、コードの2種類
.globl _IntNoArgs
.align 1
.code 16
.thumb_func _IntNoArgs
_IntNoArgs:
@ int IntNoArgs(void);
.loc 1 __LINE__ 0
adr r0, Larm1 @ Larm1 is a PC-relative address. r0's low bit will be cleared
bx r0 @ Switch to ARM mode then branch to Larm1. That's the next instruction
.align 2
.code 32
Larm1:
stmfd sp!, { r7, lr }
mov r0, #42
ldmfd sp!, { r7, lr }
bx lr
をミックスした場合私の研究は、あなたも、ARM機能のためにそれをすることを示していると思われる、GDBは_IntNoArgsを逆アセンブルする方法です。最初の2行は、正しい残りはldmia.w命令は、それによってから戻る、スタックからそれを取った後、プログラムカウンタに新しい値を入れているように見えるので、分解は、ここに停止し
0x000172c8 <+0000> add r0, pc, #0 (adr r0, 0x172cc <VoidNoArgs+4>)
0x000172ca <+0002> bx r0
0x000172cc <+0004> lsls r0, r0
0x000172ce <+0006> stmdb sp!, {r1, r3, r5}
0x000172d2 <+0010> b.n 0x17a16
0x000172d4 <+0012> lsls r0, r0
0x000172d6 <+0014> ldmia.w sp!, {r1, r2, r3, r4, r8, r9, r10, r11, r12, sp, lr, pc}
完全に間違っていますサブルーチン。
0x000172d8 <+0016> vrhadd.u16 d14, d14, d31
SI命令は、常に我々がThumbまたはARMモードであるかどうかだけで一つの命令を進めることによって、正しいことを行います。私は、「SI」解体・ペインショーで、この命令をステップオーバーした後。だからGDB はは現在の命令セットのアーキテクチャを知っている必要があります、それは逆アセンブラがその情報を取得していないということだけです。
ARMのレジスタの1つに、現在のモードを示すビットがあります。 GDBのいくつかのフォークは、どのISAを逆アセンブルするかを決定する際に、そのビットの値を使用する能力を持っていますが、これはXcode 4.2のGDBでは明らかにそうではありません。
XcodeのGDBには、「set arm disassembler」コマンドとそれに対応する「show arm disassembler」コマンドがありますが、それは役立つようですが、そうではありません。これは明らかに、iOSデバイスが使用するものよりも、他の種類のARM変種をサポートすることを意味しています。
set fallback-modeは、GDBの他のフォークではarm、thumb、autoに設定できますが、Xcodeでは設定できません。"disassembler-flavorを設定する"の場合は同上。
本当に本当に好きなのは、Classic Mac OSでMacsBugと同じように動作するマシンデバッガです。 GDBは一般にアセンブラのデバッグを行うことができますが、その目的のためにはまったくうんざりです。ソースデバッグ用に設計されているので、それは誰の欠陥でもありません。良いアセンブリデバッガは、それを最初からやり直すように設計されています。
なぜこれはhttp://programmers.stackexchange.com/からここに移行されましたか?私は不平を言っていませんが、プログラマーのボードはこの質問にもっと適していたようです。 –
それはデバッガのバグだと思うので、http://bugreport.apple.comのAppleに報告してください。 –
グラハム、良いアイデア、。私はしようとしましたが、バグ#10420051のファイルに失敗しました。残念ながら、私のフォームの提出は失敗しました。レーダーが私にバグ番号を教えてくれていた間に、バグは実際に私が知る限り入力されなかった。レーダーの問題は、私がやった[email protected]に報告するように勧められました。 Appleのシステム管理者に間違ったことを修正する機会を与えるだけでなく、何か応答があったかどうかを確認してから、バグを再送信します。 –