2010-11-05 62 views
5

夥計, 我有一個項目,我已經爲ARM Cortex-A8處理器編譯。我正在使用GCC來做到這一點。目前我的可執行文件的大小是220.1 KB。現在我修改我的makefile,我添加了標誌-mthumb,Makefile行看起來有點像這樣 -ARM Thumb模式:代碼大小不減

gcc -mcpu=cortex-a8 -mthumb -marm -mfloat-abi=softfp -mfpu=neon 

我做這改變了我所有的makefile,我建我的項目,但我得到最後還是可執行繼續爲220.1 KB。

我做了一個更改變我的命令行,我再一次增加了-mthumb-interwork選項

gcc -mcpu=cortex-a8 -mthumb -mthumb-interwork -marm -mfloat-abi=softfp -mfpu=neon 

我得到同樣大小的可執行220.1 KB。我在做這件事時錯過了什麼?

我寫了一個小程序,找到最小的兩個數的和我使用下面的命令行

gcc main.c -o main 

我得到一個8.5 KB可執行文件編譯它

接下來,我做了

gcc -mthumb main.c -o main 

我仍然得到一個8.5 KB的可執行文件。

這裏有什麼問題嗎?

我做了一個cat /proc/cpuinfo來查看我的處理器是否真的支持thumb,並且我看到它的確支持。 我得到 -

Processor: ARMv7 Processor rev 5 (v7l) 
Features: swp half thumb fastmult vfp edsp neon vfpv3 
.... 
.... 
+0

'-marm'是'-mthumb'的計數器,'gcc'是最後一個選項;這就是爲什麼* dwelch的答案有效。 – 2014-04-10 15:33:08

回答

6

我認爲-marm意味着你有一個沒有拇指的手臂,試着去除-marm。

+1

我認爲就是這樣,它很容易演示,在一個帶有小函數的小文件上嘗試-S -mthumb -marm,並且看到它會生成arm代碼,因爲-marm是你要求它做的最後一件事。然後將其更改爲-marm -mthumb,使用-mthumb最後生成拇指代碼。所以擁有 - 馬爾姆最後勝過你正在嘗試做的所有拇指的東西。 – 2010-11-06 00:36:49

+1

如果有疑問,請使用「gcc -save-temps」保存asm文件,或者在反彙編的目標代碼上使用「objdump -d」。根據指令寬度(ARM總是4個字節,Thumb是2個字節,Thumb2是2個或4個),ARM和Thumb之間的區別很容易找到。我見過在gcc輸出中Thumb fadden 2010-12-08 22:46:04

+0

+1用於管理沒有拇指的手臂。 – 2011-02-02 07:38:29

0

對於某些編譯器,thumb編譯爲ARMv7時是默認值。你確定你的原始可執行文件不是用拇指製作的嗎?

嘗試使用-mno-thumb編譯並查看代碼大小是否增加。

+0

斯蒂芬我做到了,它又是220.1 KB。不用找了! – HaggarTheHorrible 2010-11-05 15:55:02

2

沒有實際的代碼很難說,但我有幾個建議。

  1. 啓用優化。 (例如-O3 -ffunction-sections -fdata-sections)
  2. 剝離可執行文件以確保調試信息不​​被計數。
  3. 檢查實際代碼(.text)的大小,而不是文件大小。也許有一些填充正在進行。你可以使用objdump。
  4. 轉儲彙編代碼(-S開關)並檢查它是否在一種情況下實際產生ARM指令,在另一種情況下是否產生Thumb指令。