c - 链接描述文件 - RAM 和 ROM 相同的内存空间
问题描述
我尝试链接二进制文件。在我的系统上,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 内部编程模块。
推荐阅读
- android-studio - How to implement a overlapping TextView in a ImageView, which combinely works as a Button?
- c# - Is there a way to display items from an array on separate lines of a TextBox?
- reactjs - antd dropdown : selected value displaying outside the select
- jquery - 将隐藏数据添加到 HTML 表格
- javascript - 在 Laravel 中通过 Ajax 获取表单中的数据
- css - 如何使用 CSS 用省略号打破 svg 文本?
- dart - Flutter - 如何重启或重绘当前屏幕小部件
- laravel - 由 number_format() 函数格式化后遇到的格式不正确的数值
- ios - 自定义洗牌算法 - Swift
- ios - 如何为 GMSMarker 创建边界