如何在自定义riscv平台上支持c / c ++标准库(newlib)?

时间:2020-06-12 21:34:48

标签: c++ stl g++ riscv linker-scripts

我写了一个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功能的支持吗?

谢谢!

0 个答案:

没有答案