2012-11-15 80 views
8

我只使用過AVR和MSP430,但這兩者都是如此。在編譯和靜態鏈接之後,我的最終ELF二進制大約爲208kB,而Intel Hex二進制大約爲41kB。 AVRDUDE告訴我它正在上傳約18kB。這裏究竟發生了什麼?爲什麼上傳的二進制大小比實際大小要小得多?

+0

嘗試創建一個.bin文件...它也可能是也可能不是正確的大小,但可能是一個更好的指標。 .elf格式比只有加載的字節有更多的東西。 .hex文件有一些額外的東西,並在ascii中,所以你有兩倍多的字節在門外,然後添加額外的。這些文件格式全部記錄在維基百科和其他地方 –

+0

這不是說二進制文件比文件大於二進制文件。 –

回答

10

我最後的ELF二進制是208KB

各地

是的,因爲ELF是不是原始的機器代碼。它是一種通用的可執行格式,它具有重定位信息,動態加載信息,只讀數據的不同級別,可寫數據和代碼等。這些大多數與微控制器無關,因爲它沒有操作系統,沒有動態加載設施,所以大多數額外的信息都可以被剝離。

Intel Hex二進制碼約爲41kB。 AVRDUDE告訴我它正在上傳約18kB。

有兩個原因。其中一個英特爾十六進制文件包含每行結尾的校驗和。如果使用合理的平均線長度來剪切這些文件,您可以預期文件會縮小几個百分點,例如達到36kB。然後,有一個原因英特爾十六進制文件被命名爲'十六進制'文件。它們不包含原始二進制數據,而是包含十六進制格式的原始二進制數據 - 我。即一個真正的字節使用兩個字節進行編碼。所以當AVRdude上傳代碼時,它會將其轉換爲原始二進制文件(這是AVR處理器可以運行的內容),然後數據大小再次減少50%。

+2

ELF二進制文件也可能包含符號。 –

+0

@MichaelBurr是的,沒錯。 – 2012-11-15 09:55:25

+0

太棒了。聽起來不錯,謝謝! – Andrew

0

目標代碼包含附加的元數據,包括符號表和調試器信息。如果您使用的是GNU工具鏈,則大多數數據通常可能會被編譯器和/或鏈接器選項或實用程序剝離。

一個十六進制文件使用2個十六進制數字字符來表示單個字節,再加上記錄開銷,因此總是比二進制文件長度的兩倍多一點。