您好,登錄后才能下訂單哦!
1. 開發環境
宿主機:Windows 7
集成開發環境:Real-Evo IDE 3.2.5
虛擬機:Ubuntu 14.04
本篇僅介紹libffi庫的移植過程,包括資源的獲取,工程文件的修改以及編譯出錯處理。移植后的libffi支持ARM、MIPS、PowerPC和x86平臺,本文檔以x86平臺為例進行移植,在完成本文檔的操作步驟后,只需要修改libffi工程所依賴的base工程,然后重新編譯上傳,即可在所支持的平臺上使用libffi庫。
2. libffi簡介
“FFI” 的全名是 Foreign Function
Interface,通常指的是允許以一種語言編寫的代碼調用另一種語言的代碼。而 “libffi”
庫只提供了最底層的、與架構相關的、完整的“FFI”,因此在它之上必須有一層來負責管理兩種語言之間參數的格式轉換。
高級語言編譯器產生代碼時都會依據一系列的規則,這些規則十分必要,特別是對獨立編譯來說。其中之一是“調用約定” (Calling
Convention),它包含了編譯器關于函數入口處的函數參數、函數返回值的一系列假設。它有時也被稱作“ABI”(Application
Binary Interface)。調用約定(Calling
Conventions)定義了程序中調用函數的方式,它決定了在函數調用的時候數據(比如說參數)在堆棧中的組織方式。
通常來說函數調用要用到的兩條基本的指令:“CALL”指令和“RET”指令。“CALL”指令將當前的指令指針(這個指針指向緊接在CALL指令后面的那條指令)壓入堆棧,然后執行一條無條件轉移指令轉移到新的代碼地址。“RET”是與“CALL”指令配合使用的指令,在絕大多數函數中它是最后一條指令。“RET”指令彈出返回地址(就是“CALL”指令壓入堆棧的地址)并將其加載到“EIP”寄存器中,然后從這個地址開始繼續執行。
3. 資源獲取
3.1 libffi源碼獲取
一般的,可以通過官方網站獲取要移植的第三方件的資源。libffi最新版本的下載地址為https://github.com/libffi/libffi。
本篇中使用的libffi版本為libffi-2.99.9,下載后解壓文件如圖 3-1所示。
圖 3-1 libffi解壓后部分文件
其中src目錄下主要包含要編譯的源文件以及支持的平臺文件。configure是配置文件,在Linux平臺下運行該文件可生成Makefile文件,執行make命令即可生成最終的庫文件。
libffi支持的平臺可見src目錄下包含的平臺相關目錄,支持平臺如圖 3-2所示。
圖 3-2 libffi支持的平臺
移植到SylixOS后的libffi支持的平臺有ARM、MIPS、POWERPC和x86。
對于新版本的libffi,目錄結構有所不同,配置方法也有差異,在移植時需要結合具體libffi版本進行配置。
4. Linux平臺下配置
4.1 配置
編譯過程中使用的Linux環境為Ubuntu發行版。將下載的壓縮包文件拷貝到Ubuntu環境中并解壓。由于下載的庫文件已經包含了configure配置文件,因此需要執行該命令生成makefile文件,操作如圖 4-1所示。
圖 4-1執行配置文件
生成makefile文件如圖 4-2所示。
圖 4-2生成makefile文件
由于只是為了配置libffi庫,在執行完configure腳本后即完成了libffi的配置,然后保存libffi文件夾以便移植。
5. 新建libffi庫工程
5.1 導入libffi源碼
在Real-Evo IDE中創建libffi共享庫工程,刪去libffi工程中src目錄下的文件libffi.c,并導入libffi源碼文件。導入后的工程文件如圖 5-1所示。
圖 5-1 導入libffi源碼文件到libffi庫工程
5.2 修改makefile
修改libffi工程屬性為專家模式,操作如圖 5-2所示。
圖 5-2修改工程屬性為專家模式
修改libffi.mk文件,加入進行編譯的源碼文件,修改內容如圖 5-3所示。
圖 5-3 修改libffi.mk添加源文件
修改libffi.mk文件,加入頭文件路徑,修改內容如圖 5-4所示。
圖 5-4 修改libffi.mk添加頭文件路徑
其中PLATFORM定義在Makefile文件中,PLATFORM支持的平臺如圖 5-5所示。
圖 5-5 PLATFORM支持的平臺
其中TOOLCHAIN_PREFIX是和所依賴的base工程相關的。在指定好所依賴的base工程之后,TOOLCHAIN_PREFIX的取值就已經確定。
5.3 編譯libffi工程
保存修改并編譯,出現如圖 5-6所示錯誤。
圖 5-6 編譯報錯
打開ffitarget.h后可看到其內容是亂碼,所以導致出錯,刪除掉該頭文件之后重新編譯,即可編譯通過。
為了支持PowerPC平臺,需要在libffi/src/libffi/include/ffi.h文件中添加內容如圖 5-7所示。
圖 5-7 增加POWERPC宏
為了支持MIPS平臺,需要在libffi/src/libffi/src/mips/ffi.c文件中做接口替換,原調用接口為:
__builtin__clear_cache(clear_location, clear_location + FFI_TRAMPOLINE_SIZE);
替換為:
__clear_cache(clear_location, clear_location + FFI_TRAMPOLINE_SIZE);
再次編譯,即可生成libffi庫文件,生成庫文件位于Debug目錄下。如圖 5-8所示。
圖 5-8 編譯生成libnopoll庫文件
打開x86虛擬機,并配置好libffi工程的設備IP為x86虛擬機的IP,即可將生成的庫文件導入到x86虛擬機中。至此,則完成了libffi的編譯及上傳。剩下的工作則是通過測試用例測試移植后的libffi庫是否能夠正常運行。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。