我只使用過AVR和MSP430,但這兩者都是如此。在編譯和靜態鏈接之後,我的最終ELF二進制大約爲208kB,而Intel Hex二進制大約爲41kB。 AVRDUDE告訴我它正在上傳約18kB。這裏究竟發生了什麼?爲什麼上傳的二進制大小比實際大小要小得多?
8
A
回答
10
我最後的ELF二進制是208KB
各地
是的,因爲ELF是不是原始的機器代碼。它是一種通用的可執行格式,它具有重定位信息,動態加載信息,只讀數據的不同級別,可寫數據和代碼等。這些大多數與微控制器無關,因爲它沒有操作系統,沒有動態加載設施,所以大多數額外的信息都可以被剝離。
Intel Hex二進制碼約爲41kB。 AVRDUDE告訴我它正在上傳約18kB。
有兩個原因。其中一個英特爾十六進制文件包含每行結尾的校驗和。如果使用合理的平均線長度來剪切這些文件,您可以預期文件會縮小几個百分點,例如達到36kB。然後,有一個原因英特爾十六進制文件被命名爲'十六進制'文件。它們不包含原始二進制數據,而是包含十六進制格式的原始二進制數據 - 我。即一個真正的字節使用兩個字節進行編碼。所以當AVRdude上傳代碼時,它會將其轉換爲原始二進制文件(這是AVR處理器可以運行的內容),然後數據大小再次減少50%。
0
目標代碼包含附加的元數據,包括符號表和調試器信息。如果您使用的是GNU工具鏈,則大多數數據通常可能會被編譯器和/或鏈接器選項或實用程序剝離。
一個十六進制文件使用2個十六進制數字字符來表示單個字節,再加上記錄開銷,因此總是比二進制文件長度的兩倍多一點。
0
正如其他上面所說的,HEX文件格式是ascii的可印刷這使得更容易超過COMMS鏈路(例如7位調制解調器/終端),非常類似於摩托羅拉名爲.s19轉移:
相關問題
- 1. 爲什麼最終的二進制文件的大小比靜態庫的大小要小得多?
- 2. 爲什麼.sqlite DB的大小比Realm小得多?
- 3. 什麼是頂點緩衝區大小的實際大小限制?
- 4. 二進制文件大小
- 5. Lisp二進制大小
- 6. ARM二進制大小
- 7. 定義的大小不會屏幕上的實際大小
- 8. 文件的實際大小
- 9. 是byte []的byte.length()的最大大小還是實際大小?
- 10. 爲什麼mysql HEX更改二進制列大小寫?
- 11. 爲什麼在窗口大小上需要最小寬度?
- 12. 實際大小在ActionScript 3
- 13. JavaScript上傳大小限制
- 14. SugarCRM:ImageField上傳大小限制
- 15. 什麼是GKSession sendData的實際數據大小限制:toPeers:withDataMode:error:?
- 16. 圖像顯示比我的div上的實際圖像大小大很多
- 17. FFT的大小實際上是什麼意思
- 18. 爲什麼調整大小的PNG圖像比原始圖像大得多?
- 19. 優化QT的二進制大小?
- 20. 安裝的apk大小超過apk的實際大小
- 21. Laravel最大上傳大小限制
- 22. 最大上傳大小?
- 23. iTunes連接上傳問題(二進制大小)
- 24. 爲什麼XML最大實體大小受bug修復限制
- 25. 爲什麼在InnoDB中索引大小大於數據大小?
- 26. 調整圖像大小二進制
- 27. 確定直方圖二進制大小
- 28. 爲什麼當大小
- 29. 爲什麼要減小Java JVM線程堆棧的大小?
- 30. 獲取實際文件大小VS表觀大小在GO
嘗試創建一個.bin文件...它也可能是也可能不是正確的大小,但可能是一個更好的指標。 .elf格式比只有加載的字節有更多的東西。 .hex文件有一些額外的東西,並在ascii中,所以你有兩倍多的字節在門外,然後添加額外的。這些文件格式全部記錄在維基百科和其他地方 –
這不是說二進制文件比文件大於二進制文件。 –