我写了一个riscv模拟器,它加载使用riscv64.elf文件编译的riscv.elf文件,该文件是用newlib支持和c ++支持编译的。它能够运行不使用任何c / c ++ stl函数的程序。但是我希望能够使用stl函数,例如printf,cout,vector和malloc和东西。
但是我不确定如何正确执行此操作。从我的g ++ / gcc命令中删除-nostdlib是可行的,并且允许我编译使用stl功能的程序,但是它们不能正常工作。轻度的使用似乎大部分都可以,但是更重的使用会导致它开始破坏程序存储(.text为0,某些stl功能的使用会导致对地址0x00000004的0写操作)。我的猜测是发生这种情况,因为我在初始化函数中缺少一些东西,例如初始化构造函数,提供堆内容等。
现在,我知道我可能需要这些(也许还有更多东西),但是我不知道如何添加它们。因此,我需要一些帮助。 这是我当前的链接脚本:
ENTRY(riscvcoreinitfunction);
MEMORY
{
ram (rwx) : ORIGIN = 0x00000000, LENGTH = 0x003E8000
}
STACK_SIZE = 0xFFFF;
SECTIONS
{
.text :
{
KEEP(*(.vector*))
*(.text*)
} > ram
.bss (NOLOAD) :
{
*(.bss*)
*(COMMON)
} > ram
.data :
{
*(.data*);
} > ram
.stack (NOLOAD) :
{
. = ALIGN(8);
. = . + STACK_SIZE;
. = ALIGN(8);
} > ram
__global_pointer$ =. + 0x10000;
}
还有我当前的初始化函数:
extern "C"
{
void riscvcoreinitfunction()
{
asm volatile
(" .option push \t\n\
.option norelax \t\n\
1:auipc gp, %pcrel_hi(__global_pointer$) \t\n\
addi gp, gp, %pcrel_lo(1b) \t\n\
.option pop \t\n\
");
asm volatile("" ::: "memory");
main();
}
}
这就是我用来称呼g ++的东西:
riscv64-unknown-elf/bin/riscv64-unknown-elf-g++ -nostartfiles -march=rv32i -mabi=ilp32 -T linkerscript.ld -o bin.elf
我在线上找到了一个在平台上实现newlib的教程,但是它对我而言并不起作用,并且缺少诸如链接器脚本中需要的变量之类的详细信息。同样在本教程中,诸如sbrk之类的东西是未定义的,由于某种原因,它们在我的程序中已经以某种方式实现了(所以如果需要,我该如何替换它们?) 有人可以协助我添加对所需的所有基本c / c ++功能和stl功能的支持吗?
谢谢!