【发布时间】:2013-04-01 11:31:39
【问题描述】:
我正在为裸机 ARM 应用程序编写自定义链接器脚本。该应用程序存储在闪存中,目前我有一个启动代码将整个应用程序复制到 SDRAM 中,并继续在 SDRAM 中执行以提高速度。我想修改此脚本以直接从 Flash 运行整个代码,但我无法理解某些元素。
在下面的链接描述文件中,.ram_data 段在RAM 中有一个执行地址,在ROM 中有一个加载地址(这两个段都在 SDRAM 中)。据我了解,链接器使用执行地址来对所有与 PC 无关的元素进行符号解析,但是加载地址呢?在裸机 ARM 的上下文中,没有程序加载器之类的东西,链接器也无法影响我在闪存中编写程序的位置,那么它实际上是用来做什么的呢?
同样,链接器如何影响 SDRAM 在运行时是 (rx) 还是 (rw)?当我修改内存区域中的这些选项时,它实际上会改变什么吗?
MEMORY
{
RAM(rw) : ORIGIN = 0x00001000, LENGTH = 12M-4K
ROM(rx) : ORIGIN = 0x007f1000, LENGTH = 60K
}
SECTIONS
{
.startup :
{ ... } > VECTOR
.rom_text :
{ ... } > ROM
.ram_data :
{
_data_start = .;
*(.data*)
_data_end = .;
} > RAM AT>ROM
.ram_bss :
{ ... } > RAM
}
【问题讨论】:
标签: ld linker-scripts bare-metal