Linker GNU链接器标记部分,没有用于加载的初始化数据-原始二进制文件
我正在编写一个裸机ARM引导加载程序,并试图使用一些内部SRAM作为便笺簿与应用程序代码通信。为了满足我的需要,我不需要初始化或将内存归零。使用此脚本,我可以将所需的变量很好地放入内存中Linker GNU链接器标记部分,没有用于加载的初始化数据-原始二进制文件,linker,gnu,ld,linker-scripts,Linker,Gnu,Ld,Linker Scripts,我正在编写一个裸机ARM引导加载程序,并试图使用一些内部SRAM作为便笺簿与应用程序代码通信。为了满足我的需要,我不需要初始化或将内存归零。使用此脚本,我可以将所需的变量很好地放入内存中 /** * Linker script for secondary bootloader. * * Allocatest the first 1Mb of DRAM for its use. * Scratchpad in internal SRAM. */ MEMORY { 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显示内部内存部分被标记有内容、加载和数据标志,即使放在那里的变量没有初始化
我可以使用--remove section=.internal_ram在objcopy中清理这个问题,但是似乎应该有一种方法让链接器识别数据没有初始化
是否有适当的方法标记该部分 正确的节声明是:
.internal_ram (NOLOAD) :
{
. = ALIGN(4);
*(.internal_ram*)
} >SRAM
NOLOAD section属性是有文档记录的,但说明了程序加载器在加载时处理该节。起初,这似乎不适用于裸机图像,但出于这个目的,objcopy就像一个程序加载器一样,接受对象文件中的标志设置,从原始图像中省略该部分