2011-11-09 47 views
3

我的iOS應用程序是在Thumb模式下使用Apple LLVM 3.0編譯器構建的。對於armv7,我很確定這實際上是Thumb-2。如何將Xcode 4.2的iOS反彙編從Thumb轉換爲ARM?

我在ARM彙編代碼中重新實現了我最耗時的兩個函數。這些函數的調用者是Thumb,所以我使用Thumb與ARM交互操作指令在我的函數序言中切換到ARM,因此我獲得了ARM更豐富的指令集和更多寄存器。在函數出口處,我使用ARM到Thumb互操作返回到ARM模式。

GDB的反彙編對於Thumb代碼是正確的,但是當我處於ARM模式時,它將反彙編ARM指令,就好像每個指令都是一對完全不合邏輯的Thumb指令。有什麼方法可以告訴GDB切換到ARM反彙編,然後返回到Thumb代碼時,使用Thumb反彙編程序?

谷歌沒有幫助。顯然,GDB的其他分支可以做到這一點,但我還沒有想出一種方法來處理GDB。

LLDB顯然支持ARM調試,但它在Xcode 4.2的iOS設備上還沒有工作。當我在Product - > Edit Scheme中選擇LLDB調試器時,在我的代碼中設置一個斷點,我的App在命中斷點之前掛起。

自從我做了任何類型的彙編已經很長時間了,所以我通過實現帶有各種參數的函數並在C和ARM彙編中返回各種類型的結果,來刷新ARM調用約定。 lower_case函數是C,CamelCase函數是程序集。我打電話abiTest的第一件事從main()中,和使用斷言(),以確保它返回YES

BOOL abiTest(void) 
{ 
    void_no_args(); 
    VoidNoArgs(); 

    if (42 != int_no_args()) 
     return NO; 

    if (42 != IntNoArgs()) 
     return NO; 

    return YES; 
} 

下面是IntNoArgs源。 .thumb_func是鏈接器的指令。我的研究似乎表明,你想讓它甚至ARM的功能,如果一個混合的兩種類型的代碼

.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 

下面是GDB如何拆卸的_IntNoArgs。前兩行是正確的,其餘的是完全錯誤的

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} 

拆卸這裏停止,因爲ldmia.w指令似乎把一個新值到程序計數器從堆棧服用後,由此從返回子程序。之後,我執行這個指令與「SI」拆卸窗格中顯示:

0x000172d8 <+0016> vrhadd.u16 d14, d14, d31 

硅指令總是做正確的事,通過推進只需一條指令,我們是否在Thumb或ARM模式。所以GDB 必須知道當前的指令集架構,只是反彙編器沒有得到這些信息。

ARM的寄存器中有一點指示當前模式。 GDB的一些分支有能力在確定要反彙編的ISA時使用該位的值,但顯然這與Xcode 4.2的GDB不同。

Xcode的GDB有一個命令「set arm disassembler」及其相應的「show arm disassembler」,看起來會有所幫助,但事實並非如此。這顯然意味着支持其他類型的ARM變種,而不是iOS設備使用的變種。

可以將「set fallback-mode」設置爲GDB的其他分支的arm,thumb或auto,但不能設置爲Xcode。「設置反彙編 - 味道」同上。

我真的會真的很像一臺機器調試器,它的工作就像MacsBug在Classic Mac OS上所做的一樣。雖然GDB通常能夠進行彙編程序調試,但它完全是爲了這個目的。這不是任何人的錯,真的,因爲它是專門爲源代碼調試而設計的。一個好的彙編調試器被設計爲從頭開始這樣做。

+0

爲什麼從http://programmers.stackexchange.com/遷移到這裏?我沒有抱怨,但在我看來,程序員的董事會更適合這個問題。 –

+0

這聽起來像是調試器中的一個錯誤,您應該通過http://bugreport.apple.com向Apple報告。 – 2011-11-09 18:09:06

+0

格雷厄姆,好主意,有點。我只是試圖但未能提交Bug#10420051。不幸的是,我的表單提交失敗。雖然雷達給了我一個錯誤號,但是錯誤實際上並沒有被輸入,據我所知。我被建議將雷達問題報告給[email protected],我剛剛這樣做。我會等待看看我是否得到任何迴應,並且讓Apple的系統管理員有機會解決任何錯誤,然後重新提交錯誤。 –

回答

0

ABI函數調用指南指出,在ARM和Thumb模式之間的切換隻能在iOS的函數邊界進行。確保你的函數是ARM或者Thumb,調試器工作正常。