2012-12-30 47 views
2

我正在嘗試使用帶有Raspberry Pi的Wifi-Dongle。加密狗的供應商提供了一個Linux驅動程序,我可以在ARM架構上成功編譯,但是,驅動程序附帶的一個目標文件已針對x86體系結構進行了預編譯,這會導致鏈接程序失敗。將目標文件轉換爲另一種體系結構

我知道再次編譯該(很大)文件會容易得多,但我無法訪問源代碼。

是否有可能將該目標文件從x86架構轉換爲ARM架構?

謝謝!

+0

我相信這需要一個完整的x86代碼解釋器。 –

+0

你有鏈接到文件嗎?我想嘗試一下。 –

回答

7

恩,不,它看起來像是在浪費時間。 Wi-Fi驅動程序非常複雜,你說這個麻煩的目標文件很大。很多翻譯的痛苦,以及成功調試的機會很少。另外,在這個目標文件和系統其餘部分之間傳遞的任何參數都不會在x86和ARM之間直接轉換。

+0

正確,這不僅僅是從一個指令集轉換到另一個指令集,而是從一個ABI(應用程序二進制接口)轉換到另一個。這包括參數傳遞,結構佈局,系統調用接口等。可以將個別情況視爲「英雄」努力,但是任何通用的即插即用解決方案在技術上都是困難的,並且是合法的噩夢。 –

0

您可以通過安裝x86 GNU binutils手動轉換x86程序集,並使用objdump反彙編目標文件 。可能有些地址會有所不同,但應該直截了當。

+0

我在Linux中並不是那麼有經驗,我怎樣才能獲得x86 binutils? 並且在拆解之後,我需要做些什麼才能將文件組裝回目標文件? – Dawamaha

+0

我認爲你可以在linux/arm中直接使用objdump,它應該理解linux/x86:'objdump -d file.o',將arm的限制寫入file.s,然後用'as(1)'或' GCC(1)'。 http://arm-assembler-for-raspberrypi.posterous.com/lesson-1-hello-world – emil

+2

真的,這不是一個超過幾百或幾千條指令的可行解決方案,除非你有對它的工作原理有一個合理的理解 - 即使如此,這也是一項非常艱苦的工作。編譯代碼並不總是很容易理解[因爲編譯器以各種方式重新排序命令,內聯通常被稱爲的函數等]。相信我,我花了好幾個小時試圖弄清楚一些反彙編的代碼是如何工作的 - 即使你大致知道它做了什麼,這是很難的工作。 –

1

沒有合理的方法來做到這一點。請聯繫製造商,詢問他們是否可以在ARM代碼中提供相關代碼,因爲x86對您無用。如果他們無法做到這一點,則必須找到不同的硬件供應商(包含ARM版本,或完全開放源代碼的所有組件)或軟件供應商[假設有另一個供應商的來源]。

0

是的,你絕對可以做一個靜態的二進制翻譯。 x86拆卸是痛苦的,但如果這是從高層次編譯的話,那麼它就不會如此糟糕。

難道真的值得嗎?可以嘗試使用指令集模擬器。你是否分析了使用的指令數量?需要系統調用等?

到目前爲止,您在反彙編過程中有多遠?

0

也許該文件只包含WiFi固件的二進制轉儲?如果是這樣,你不需要指令翻譯,並且可以使用objcopy來完成轉換。

您可以使用objdump -x file.o並查看是否有任何真正的可執行代碼在obj文件中,或者它只是數據。

3

理論上,是的。在沒有訪問源代碼的情況下在真正的內核驅動程序上執行它將會很困難。如果你有高質量的目標文件拆卸,並且目標文件中的代碼是「行爲良好」的(使用標準調用約定,不需要自修改代碼),那麼你可以自動將X86指令轉換爲arm說明。但是,您可能沒有高質量的拆卸。特別是,可能有部分目標文件無法正確歸類爲執行正常遞歸下降拆卸的代碼或數據。如果將數據誤解爲代碼,它將被轉換爲ARM代碼,而不是按原樣複製,因此將會有錯誤的值。這可能會導致代碼無法正常工作。

即使你很幸運,能夠進行正確分類的所有目標文件中的地址,有將你絆倒幾個問題:

  1. 上X86的調用約定與調用不同ARM上的約定。這意味着您必須識別與X86調用約定相關的模式,並將其更改爲使用ARM調用約定。這是一個不重要的重寫。

  2. ARM上的硬件接口與X86上的不同。您必須瞭解驅動程序如何工作才能翻譯代碼。這需要大量的X86硬件可比性層,或者需要對驅動程序的工作方式進行反向工程。如果您可以對驅動程序進行反向工程,那麼您無需翻譯它。你可以寫一個手臂版本。

  3. ARM和X86的內核內核APIS不同。您必須瞭解這些差異以及如何在它們之間進行翻譯。這可能不是微不足道的。

  4. Linux內核使用「替代」機制,它將在代碼首次加載到內核時動態地重寫機器代碼。例如,在單處理器機器上,鎖通常被替換爲無操作來提高性能。諸如「popcnt」之類的指令被不支持它的機器上的函數調用所取代,等等。它在內核中的使用非常普遍。這意味着根據上面給出的定義,對象中的代碼很有可能是文件不「良好」。您必須驗證目標文件不使用該機制,或者找到一種方法來轉換它的使用。

  5. X86使用與ARM不同的內存模型。爲了「安全地」將X86代碼轉換爲ARM(不引入競爭條件),每次訪問內存後都必須引入內存隔離。這將導致在ARM芯片上出現真正的糟糕性能。搞清楚什麼時候需要引入內存隔離(而不是到處都是),這是一個極其困難的問題。在這種分析中最成功的嘗試需要自定義類型系統,而您在目標文件中不會有這些系統。

你最好的選擇(成功的最快途徑)是嘗試和逆向工程確定目標文件的作用,然後將其替換。

0

如果您可以使用Hex-Rays反編譯器訪問IDA,則可以(通過一些工作)將目標文件反編譯爲C代碼,然後嘗試重新編譯爲ARM。

相關問題