2015-08-28 18 views
2

我在寫一個ARMv7反彙編程序。 在ARM參考手冊中清楚地描述了在ARM和Thumb模式之間切換的方式,但您如何知道程序啓動的模式?如何知道在程序入口點的ARM或Thumb模式

我使用的Xcode在默認情況下編譯成拇指,所以我知道我所有的自己的節目將在拇指啓動,除非我強迫編譯到ARM模式。但是,我希望能夠執行任意的mach-o可執行文件,並在代碼的開頭找到指令集模式。

在mach-o頭文件中是否有某處指定了入口點處的指令集?

+0

這可能取決於開始地址是偶數還是奇數。 –

+0

@RossRidge你的意思是半字對齊?我在一個字對齊的地址開始 –

+0

我的意思是偶數或奇數。BX/BXL指令根據地址是偶數還是奇數切換到ARM和Thumb模式。 –

回答

6

處理器知道,它通過開啓程序計數器的最低顯著位,導致程序計數器有一個奇數值是在拇指模式。該位在指令讀取時被忽略,您可以通過切換該位來在ARM和拇指模式之間切換。

當您創建ARM二進制文件時,鏈接器將設置符號地址的最低有效位,具體取決於此符號是指向ARM還是拇指代碼,以便處理器在程序啓動時自動選擇正確的模式。你不需要關心這一點。

+0

程序計數器不奇怪,lsbit沒有設置。輸入到可以切換模式(bx,pop,並且使用armv7和其他數組)的指令之一的值被設置爲lsbit,lsbit在進入程序計數器時被剝離並且基本上被T位cpsr。 –

2

大多數操作系統在您的應用程序入口點C運行時支持之前插入一些代碼。他們將以任何編寫代碼的模式啓動您的應用程序。當調用main()或其他入口點時,該代碼將根據需要進行模式更改。

對於iOS,我假設您使用的是Xcode,因此您的iOS SDK目錄中的代碼位於/usr/local/lib/crt0.o。反彙編顯示符號start是ARM代碼。也就是說,iOS應用程序始終以ARM模式運行,但之後它們可以更改模式。

0

取決於您在入口點的含義。答案就在於這個定義。操作系統必須有一個定義,因爲它必須處於正確的模式。所以或者操作​​系統總是定義arm模式,然後代碼可以根據需要進行切換。或者,如果您使用像入門點的elf這樣的文件格式,那麼您可能會得到一個偶數地址是手臂,而奇數地址是拇指,與bx/blx指令相匹配。

如果您正在談論其中一個核心,那麼armv7m將始終啓動並且必須保持拇指模式。 armv7a和r將以手臂模式啓動(復位,其他人在手臂文檔中定義,可能是手臂模式),然後代碼可以切換。

如果你只是試圖反彙編一些通用的對象文件,那麼你可能無法弄清楚。當你看到很多0xE(每個單詞的開始),可能是arm代碼,0x6或0x7,而不是很多的0xE或沒有(每半字),那麼可能是拇指碼。但這不是你可以依賴的任務,因爲如果有切換髮生,前幾條指令可能會切換模式。

此外,如果一個ELF文件你也許可以從塊頭告訴,我認爲這是GNU工具是如何計算出來,因爲他們肯定不檢測到它的飛行。所以這很可能是你想要做這個,檢查精靈文件。如果這是一個原始的二進制文件,只是指令和數據...祝你好運...

相關問題