【问题标题】:How do i set up instruction & data memory address when using "riscv32-unknown-elf-gcc"?使用“riscv32-unknown-elf-gcc”时如何设置指令和数据存储器地址?
【发布时间】:2020-11-09 04:24:00
【问题描述】:

我设计了 RISCV32IM 处理器,并使用“riscv32-unknown-elf-gcc”生成代码进行测试。

但是,生成代码的 PC(指令存储器地址)值和数据存储器地址具有任意值。我使用了这个命令:

riscv32-unknown-elf-gcc -march=rv32im -mabi=ilp32 -nostartfiles test.c

能否知道是否可以设置我想要的指令和数据内存地址?

谢谢。

谢谢你的回答。

我只设计了硬件,这是我第一次使用软件工具链。 即使我的问题是初级的,也请理解。

该图是“-v”选项的结果。 enter image description here

我无法修改脚本文件,因为我在 DOCKER 环境中使用 riscv 工具链。 所以,我尝试复制脚本文件(elf32lriscv.x),修改它。 我将其修改为 0x10000 ==> 0x00000。 复制的脚本文件名为“test5.x”。

然后执行如下。 我做错了什么?

enter image description here

【问题讨论】:

    标签: elf riscv riscv32


    【解决方案1】:

    riscv 编译器使用默认链接器脚本来放置文本和日期部分...。

    如果在命令行riscv32-unknown-elf-gcc -v -march=rv32im -mabi=ilp32 -nostartfiles test.c 中添加-v 选项,您将看到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 }

    【讨论】:

    • 感谢您的帮助!我使用下面的命令解决了这个问题。 "riscv32-unknown-elf-gcc -march=rv32im -mabi=ilp32 -nostartfiles -O3 -x c -Wl,-T,/work/test5.x -o test5.o test5.c"
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-09
    • 2015-07-12
    • 2019-07-13
    • 2013-05-11
    • 2011-05-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多