ベア メタル ARM ブート ローダーを作成しており、アプリケーション コードと通信するためのスクラッチ パッドとして内部 SRAM を使用しようとしています。私のニーズでは、メモリを初期化またはゼロにする必要はありません。このスクリプトを使用すると、必要な変数をメモリに問題なく配置できます。
/**
* 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 は、内部変数が初期化されていないにもかかわらず、CONTENTS、LOAD、および DATA フラグでマークされている internal_ram セクションを示しています。
--remove-section=.internal_ram を使用して objcopy でこれをクリーンアップできますが、データが初期化されていないことをリンカに認識させる方法があるはずです。
セクションを適切にマークする方法はありますか?