C 链接器脚本-RAM和ROM内存空间相同

C 链接器脚本-RAM和ROM内存空间相同,c,compilation,linker,linker-errors,C,Compilation,Linker,Linker Errors,我尝试链接一个二进制文件。在我的系统上,RAM和ROM地址空间重叠,但在不同的总线上(指令总线与数据总线) 所以我的目标是得到两个二进制文件。一个包含ROM内容(程序),另一个包含RAM内容(.data部分)。我猜链接器不能同时生成这两个文件。我的想法是运行两个单独的链接器,但问题是,例如在“RAM运行”中,它会丢失.text部分。有没有更方便的方法 以下是我第二次运行的脚本: OUTPUT_ARCH( "riscv" ) /* initialize helper variables */ R

我尝试链接一个二进制文件。在我的系统上,RAM和ROM地址空间重叠,但在不同的总线上(指令总线与数据总线)

所以我的目标是得到两个二进制文件。一个包含ROM内容(程序),另一个包含RAM内容(.data部分)。我猜链接器不能同时生成这两个文件。我的想法是运行两个单独的链接器,但问题是,例如在“RAM运行”中,它会丢失.text部分。有没有更方便的方法

以下是我第二次运行的脚本:

OUTPUT_ARCH( "riscv" )

/* initialize helper variables */
RAMSIZE = $RAMSIZE;
RAM_OFFSET = $RAMOFFSET;

MEMORY {
  ram (!rx) : ORIGIN = RAM_OFFSET, LENGTH = RAMSIZE /* size of Data Memory and offset */
}

SECTIONS {
  .sdata : { *(.sdata) } > ram              /* global/static variables */
}
我发现以下错误: 错误:没有为可加载节“.text”指定内存区域

有没有更方便的方法


我找到了链接器首先生成程序数据的解决方案。之后,它将填充.data部分。RAM和ROM都以0x0000开头。为了避免重复链接器错误,我用“ram AT rom标记”标记了.data部分。我的一个脚本对这个二进制文件进行后期处理,将这两个部分分开,并用编程器控制和地址数据为SoC内部编程模块标记字节。

@tilz0R几个具有紧密地址映射的8/16位MCU选择将RAM和ROM置于相同的地址,以避免复位。RAM通常优先,如果你想从RAM后面拿出ROM,你必须调整一些寄存器。例如,NXP S12系列通常是这样工作的。是的,这很烦人。@tilz0R:这是我自己的riscv cpu实现。