elf - 使用“riscv32-unknown-elf-gcc”时如何设置指令和数据内存地址?
问题描述
我设计了RISCV32IM处理器,我使用“riscv32-unknown-elf-gcc”生成代码进行测试。
但是,生成代码的 PC(指令存储器地址)值和数据存储器地址具有任意值。我使用了这个命令:
riscv32-unknown-elf-gcc -march=rv32im -mabi=ilp32 -nostartfiles test.c
我能知道我是否可以设置我想要的指令和数据存储器地址吗?
谢谢。
谢谢你的答案。
我只设计了硬件,这是我第一次使用软件工具链。即使我的问题是初级的,请理解。
该图是“-v”选项的结果。 在此处输入图像描述
我无法修改脚本文件,因为我在 DOCKER 环境中使用 riscv 工具链。所以,我尝试复制脚本文件(elf32lriscv.x),修改它。我将其修改为 0x10000 ==> 0x00000。复制脚本的文件名为“test5.x”。
并执行如下。我究竟做错了什么?
解决方案
riscv 编译器使用默认链接器脚本来放置文本和日期部分...。
如果您-v
在命令行中添加选项riscv32-unknown-elf-gcc -v -march=rv32im -mabi=ilp32 -nostartfiles test.c
,您将看到 collect 2 使用的链接描述文件(通常为 -melf32lriscv。您可以在其中找到链接描述文件${path_to_toolchain}/riscv32-unknown-elf/lib/ldscripts/
(默认为 .x)。
您也可以riscv32-unknown-elf-ld --verbose
像@Frant 解释的那样使用。但是,如果工具链是使用 enable multilib 编译的,并且您为 rv64 编译但默认为 rv32,则需要小心,反之亦然。可能不是这种情况,但要确保您可以-A elf32riscv
为 rv32 指定拱门。
要设置地址,您可以创建自己的链接器脚本或复制和修改默认的链接器脚本。您只能像@Frant 解释的那样修改可执行文件的开头,或者进行更多修改并将任何您想要的东西放在您想要的位置。
准备好自己的链接器脚本后,您可以使用 -Wl,-T,${own_linker_script } 将其传递给链接器。你的命令将是riscv32-unknown-elf-gcc -march=rv32im -mabi=ilp32 -nostartfiles test.c -Wl,-T,${own_linker_script }
推荐阅读
- java - 为什么 Feedly API 没有返回类别流中的所有 ids 条目?
- java - 春季启动资源getFile()不起作用
- docker - Yii 2 入门套件 - docker 在文件 .\.env 中:环境变量名称“YII_DEBUG”可能不包含空格。事件返回错误代码 1
- python - 仅当序列在 python 正则表达式中的另一个序列中具有相同数量的字符时,如何匹配特定的字符序列?
- sql - SQL Server 中的 SET 指令不起作用
- c# - 我们如何才能禁用常规按钮,直到整个 dataGridView 完全用 C# 中的有效值填充
- jquery - 通过单击提交获取单选按钮的值
- tensorflow - 更高效的 Keras LSTM 输入?
- api - Ebay:返回已售商品数量的最佳 API 是什么
- php - Bootstrap Grid 中的 Wordpress 自定义查询