Wie unterstütze ich die C/C ++ - Standardbibliothek (NEWLIB) auf der benutzerdefinierten RISCV -Plattform?C++

Programme in C++. Entwicklerforum
Anonymous
 Wie unterstütze ich die C/C ++ - Standardbibliothek (NEWLIB) auf der benutzerdefinierten RISCV -Plattform?

Post by Anonymous »

Ich habe einen RISC-V-Emulator geschrieben, der Risc-V.Lelf Dateien lädt, die mit "RISCV64 Unbekannter Elf" -ToolChain zusammengestellt wurden, die mit C ++-und NewLib-Unterstützung zusammengestellt wurden. Es kann Programme ausführen, die keine C/C ++ -Stl -Funktionen verwenden. Ich möchte jedoch STL -Funktionen wie Printf , Cout , Vector und malloc verwenden. Das Entfernen von -nostdlib aus meinem G ++/GCC -Befehl funktioniert und ermöglicht es mir, Programme zu kompilieren, die STL -Funktionen verwenden. Sie funktionieren jedoch nicht ordnungsgemäß. Der milde Gebrauch scheint meistens in Ordnung zu sein, aber eine schwerere Verwendung führt dazu, dass es die Speicherung von Müllprogrammen startet (Speicherprogramm (

Code: Select all

.text
Bei 0 führt die Verwendung bestimmter STL -Funktionen zu 0 Schreibvorgängen auf 0x00000004 und up). Ich vermute, das passiert, weil mir die Dinge in meiner Init -Funktion wie Initialisierung von Konstruktoren, die Bereitstellung von Dingen und dergleichen fehlt. Ich hätte mir also etwas Hilfe.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;
}
< /code>
und meine aktuelle Init-Funktion: < /p>
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();
}
}
< /code>
Und das nenne ich G ++: < /p>
riscv64-unknown-elf/bin/riscv64-unknown-elf-g++ -nostartfiles -march=rv32i -mabi=ilp32 -T linkerscript.ld -o bin.elf
< /code>
Ich habe online ein Tutorial für die Implementierung von Newlib in meiner Plattform gefunden, aber es funktioniert nicht wirklich für mich und fehlt Details wie die Variablen, die ich in meinem LinkerScript benötige. Auch im Tutorial sind Dinge wie SBRK undefiniert, wo sie in meinem Programm aus irgendeinem Grund irgendwie eine Implementierung haben. (Wie kann ich sie bei Bedarf ersetzen?)
Kann mich jemand unterstützen, um Unterstützung für alle erforderlichen grundlegenden C/C ++ - Features und STL -Funktionen hinzuzufügen?

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post