在BREW項目中使用GCC編譯器

  最近公司因爲版權原因,不能繼續使用ADS編譯器,而是換成了免費的gcc編譯器。

  經過一段時間的試用磨合,現在公司裏大部分應用在生成mod時都使用gcc編譯器。小部分因爲容量限制,使用的是公司購買的RealView編譯器。gcc 編譯器使用thumb模式生成的mod在手機上跑有問題,尚未解決,因此mod體積要比可以使用thumb模式的RealView大一些。但是購買的RealView版本,一套只能裝一個機器。一套RealView幾萬塊錢,每臺機器裝又不現實。即使使用telnet遠程編譯,也不如本機上裝的gcc方便。

  使用gcc的過程中還是頗費了一番周折的,下面記錄一下遇到的困難,希望能給大家提供一些幫助。

 

  1.GCC版本

  在BREW Forum上瞭解到BREW圈子裏,GNUDE和WINARM是兩個用的比較多的windows下的arm-gcc編譯環境(還有一個更新的YAGARTO)。GNUDE的gcc編譯器是3.x版本,WINARM的是4.x版本。GNUDE在win7上生成源文件依賴文件列表時編譯器會死掉,因此順勢就用了版本較新的WINARM。

 

  2.搭配工具

  項目要有一個針對GCC的Makefile。這個Makefile可以自己寫,也可以使用BREW SDK Tools 1.1.1 SP06帶的VC插件自動生成。如果是自動生成的話,注意要配好GCC的環境變量。例如我的WinARM裝在D盤根目錄下,環境變量就要設爲

GCCHOME=D:/WinARM

GCCLIBPATH=D:/WinARM/lib/gcc/arm-elf/4.1.1

Path裏也要加入D:/WinARM/bin

 

  3.鏈接腳本問題

  需要給GCC鏈接器提供一個鏈接腳本,如果使用BREW SDK Tools 1.1.1 SP06的話,有一個默認的鏈接腳本elf2mod.x。如果多文件工程,使用-O2或-Os編譯選項的話,這個鏈接腳本會有問題,它不能保證AEEMod_Load放在mod的0地址處,而對於BREW程序而言,這又是必須的。我稍微修改了下elf2mod.x文件,這樣定義.text段,就可以使用優化編譯選項了。

 

  .text           : AT(0)

   {

     "AEEMod*.o"(.text.AEEMod_Load) /*add by zp,10.06.08*/

     *(.text .stub .text.* .gnu.linkonce.t* .glue_7t .glue_7)

   } :ER_RO =0

 

  4.鏈接錯誤

  剛開始使用WinARM時,鏈接器總報告這樣的錯誤

undefined reference to `abort'

undefined reference to `_sbrk_r'

  開始我以爲是沒有鏈接正確的gcc庫,後來發現WinARM使用了一個叫做NewLib的庫,這個庫裏有些與硬件相關的底層函數是需要用戶自己定義的。而程序裏使用這些底層功能的地方是一個叫做__cxa_pure_virtual的系統函數(純虛函數調用的錯誤處理函數)。我們只要將這個函數定義成空就可以繞過這個問題了。

void __cxa_pure_virtual (void) {}

 

  5.寬字符串

  使用AECHAR的話,GCC默認是4個字節,與BREW標準不符。需要使用一個編譯選項-fshort-wchar,否則使用寬字符串的地方會出錯。

 

  6.浮點數問題

  GCC的double格式可以稱爲middle endian(即DWORD內部是little endian,DWORD之間是big endian),這與手機上的BREW實現是不一致的。因此如果調用BREW的浮點數接口,例如FADD / WSTRTOFLOA等,得到結果是不正確的。其實一般的加減乘除,直接使用運算符就可以了(GCC的這個解決方案支持全局變量,進而支持浮點數運算)。如果要使用FSQT等函數,可以在運行時動態判斷浮點數格式,在與BREW接口交互時進行必要的轉換。

 

  7.參考資料

 

  a.

HOWTO Compile BREW applets with WinARM 4.1.0

(and other applet startup topics)

——————http://brew.wardco.com/

  目前發現的最好的參考資料,有編譯選項的詳細說明,各種編譯器的對比數據,對鏈接腳本也有細緻的講解

 

  b.

使用GNU GCC創建BREW應用

——————http://blog.vckbase.com/knight/archive/2009/06/29/16801.html

  中文的,還附帶一份Makefile模板

 

發佈了56 篇原創文章 · 獲贊 26 · 訪問量 22萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章