2013-09-26 66 views
1

已經閱讀過此文件但無法解決我的問題。由objcopy生成的原始二進制文件太大

huge binary files with objcopy

對於一些測試的需要。 我必須在鏈接時添加以下鏈接腳本。

.section_test 0x11323000: { *(.section_test) } 

該自定義部分必須從大地址0x11323000開始。

然後使用objcopymips生成原始的二進制文件

objcopymips -O binary vxWorks.st E0122.bin  

這一步,使最終的原始二進制文件,bin文件,太大。從27MB到超過270MB。

以這種方式,它不能加載到我們的機器中,只有大約64MB的物理內存。

我可以在不刪除任何部分的情況下縮小它的大小並仍然讓它可執行嗎?

回答

1

objcopy -O binary根據段的加載地址生成程序的內存映像。在你的情況下,.section_test的加載地址和運行時地址是相同的,即加載地址是0x11323000,它解釋了大文件的大小。

通常的解決方案是創建一個帶有壓縮加載映像的可執行文件,並讓程序在使用之前將必要的部分從其加載地址複製到其運行時地址。

例子:

.section_test 0x11323000 : AT(some-small-address) { *(.section_test) } 

.section_test 0x11323000 : { *(.section_test) } AT> some-region-name 

查看此網頁,以及: https://sourceware.org/binutils/docs/ld/Output-Section-LMA.html#Output-Section-LMA

+0

完美的答案,非常感謝!我之前檢查過這個手冊,但是錯過了這部分...... – oyss

+0

我明白答案,但爲什麼bss部分不包含在大文件中? (在上面的鏈接示例中) - bss部分沒有「AT」 – ransh

相關問題