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中清理它,但似乎應該有一種方法讓連接器識別數據未初始化。
有沒有辦法適當地標記該部分?