Лисья Нора

Оглавление


§ GCC

Стандартный шаблон для компилятора gcc:
RC=riscv64-unknown-elf
all: dump
$(RC)-gcc -march=rv32i -mabi=ilp32 -nostdlib -T linker.ld -Os main.c -o main.elf
$(RC)-objcopy -O binary main.elf main.bin
dump:
$(RC)-objdump -S main.elf > dump.lst
Пояснения к компиляции:
Опционально:

§ main.c

Ниже представлен код, который выведет "Hello World" в условный адрес 0x10000000:
__attribute__((section(".text.entry")))
void _start()
{
asm("li sp, 0x10000");
 
char *str = "Hello World!\n";
volatile char *uart = (char *)0x10000000;
 
while (*str) { *uart = *str; str++; }
for (;;);
}
В коде принудительно устанавливается высота стека, хотя этим и должна заниматься ОС, но так как код запускается на чистом "железе" с нуля, то надо заполнять этот момент самостоятельно.

§ Linker.ld

Общий шаблон линкера.
SECTIONS
{
. = 0x0; /* Стартовый адрес */
 
.text : {
*(.text.entry)
*(.text)
}
 
.rodata : { *(.rodata .rodata.*) }
.data : { *(.data) }
.bss : { *(.bss) }
 
_stack_top = 0x10000;
 
/DISCARD/ : { *(.note.GNU-stack) *(.gnu_debuglink) }
}
Указываются важные точки: