Как поддержать стандартную библиотеку C/C ++ (NewLib) на пользовательской платформе RISCV?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Как поддержать стандартную библиотеку C/C ++ (NewLib) на пользовательской платформе RISCV?

Сообщение Anonymous »

Я написал эмулятор RISC-V, который загружает файлы RISC-v .elf , скомпилированные с помощью инструмента «RISCV64 неизвестного ELF», скомпилированным с поддержкой C ++ и Newlib. Он может запускать программы, которые не используют какие -либо функции C/C ++ STL. Тем не менее, я хотел бы иметь возможность использовать функции STL, такие как printf , cout , vector и malloc и все такое.
Я не уверен, как правильно это сделать. Удаление -nostdlib из моей команды G ++/GCC работает и позволяет мне компилировать программы, которые используют функции STL, однако они не работают должным образом. Мягкое использование, кажется, в основном в порядке, но более тяжелое использование заставляет его начать хранение программы для уничтожения ( При 0, использование определенных функций STL приводит к обращению 0 записей 0x00000004 и выше). Я предполагаю, что это происходит потому, что мне не хватает чего -то в моей функции инициализации конструкторов, предоставление вещей и тому подобного. Так что я хотел бы некоторую помощь.
Это мой текущий сценарий линкера: < /p>
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>
и моя текущая функция инициирования: < /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>
И это то, что я использую для вызова g ++: < /p>
riscv64-unknown-elf/bin/riscv64-unknown-elf-g++ -nostartfiles -march=rv32i -mabi=ilp32 -T linkerscript.ld -o bin.elf
< /code>
Я нашел учебник в Интернете для реализации Newlib на моей платформе, но это на самом деле не работает для меня, и мне не хватает подробностей, таких как какие переменные мне нужны в моем Linkerscript. Кроме того, в учебном пособии, такие как SBRK, не определены, где в моей программе у них уже есть реализация по какой -то причине. (Итак, как мне заменить их при необходимости?)
Может ли кто -нибудь помочь мне в добавлении поддержки всех основных необходимых функций C/C ++ и функций STL?

Подробнее здесь: https://stackoverflow.com/questions/623 ... v-platform
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»