2014-02-21 18 views
2

我正在編寫一個裸機ARM引導加載器,並試圖使用一些內部SRAM作爲便箋與應用程序代碼進行通信。爲了我的需要,我不需要初始化或清零內存。使用這個腳本,我可以將我想要的變量放在內存中。GNU鏈接器標記部分沒有用於LOAD的初始化數據 - 原始二進制巨大

/** 
* Linker script for secondary bootloader. 
* 
* Allocatest the first 1Mb of DRAM for its use. 
* Scratchpad in internal SRAM. 
*/ 

MEMORY 
{ 
    SRAM : o = 0x402F0400, l = 0x0000FC00 /* 63kB available internal SRAM */ 
    DDR0 : o = 0x80000000, l = 1M   /* 1Mb external DDR Bank 0 */ 
} 

OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm") 
OUTPUT_ARCH(arm) 

SECTIONS 
{ 
    .startcode : 
    { 
     __AppBase = .; 
     . = ALIGN(4); 
     *init.o  (.text) 
    } >DDR0 

    .text : 
    { 
     . = ALIGN(4); 
     *(.text*) 
     *(.rodata*) 
    } >DDR0 

    .data : 
    { 
     . = ALIGN(4); 
     *(.data*) 
    } >DDR0 

    .bss : 
    { 
     . = ALIGN(4); 
     _bss_start = .; 
     *(.bss*) 
     *(COMMON) 
     _bss_end = .; 
    } >DDR0 

    .stack : 
    { 
     . = ALIGN(4); 
     __StackLimit = . ; 
     *(.stack*) 
     . = __AppBase + 1M; 
     __StackTop = .; 
    } >DDR0 
    _stack = __StackTop; 

    .internal_ram : 
    { 
     . = ALIGN(4); 
     *(.internal_ram*) 
    } >SRAM 
} 

當使用objcopy創建原始二進制文件時,我得到了巨大的文件。我假設這是因爲原始二進制文件的第一個字節實際上是內部存儲器,其數據填充到.text部分的開頭。 Objdump -h顯示即使放置在那裏的變量未被初始化,internal_ram部分也被標記爲CONTENTS,LOAD和DATA標誌。

我可以使用--remove-section = .internal_ram在objcopy中清理它,但似乎應該有一種方法讓連接器識別數據未初始化。

有沒有辦法適當地標記該部分?

回答

2

正確的部分聲明:

.internal_ram (NOLOAD) : 
{ 
    . = ALIGN(4); 
    *(.internal_ram*) 
} >SRAM 

的NOLOAD部分屬性被記錄,但在程序處理裝載機在加載時部分方面講。起初,這似乎並不適用於裸機映像,但爲此目的,objcopy像一個程序加載器一樣行爲,並且尊重目標文件中的標誌設置,省略了原始映像中的部分。