aboutsummaryrefslogtreecommitdiff
path: root/prog/link.ld
blob: 9644d5949e17668ad18cf74dc2eecadd5591001a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
/* Linker script for RISC-V */

/* Define memory regions */
MEMORY
{
    ROM (rx)  : ORIGIN = 0x00010000, LENGTH = 0x1000  /* 1024 bytes for ROM */
    RAM (rwx) : ORIGIN = 0x00100000, LENGTH = 0x1000  /* 1024 bytes for RAM */
}

ENTRY(_start)

/* Define sections */
SECTIONS
{
    /* Code section */
    .text :
    {
        KEEP(*(.init))
        KEEP(*(.text))
        KEEP(*(.fini))
        KEEP(*(.rodata))
        _etext = .;
    } > ROM

    /* Initialized data section */
    .data : AT(_etext)
    {
        _sdata = .;
        KEEP(*(.data))
        _edata = .;
    } > RAM

    /* Uninitialized data section */
    .bss :
    {
        _sbss = .;
        KEEP(*(.bss))
        KEEP(*(COMMON))
        _ebss = .;
    } > RAM

    /* Stack section */
    .stack (NOLOAD) :
    {
        _stack_start = .;
        . += 0x100; /* Adjust the size as needed */
        _stack_end = .;
    } > RAM

    /* Heap section */
    .heap (NOLOAD) :
    {
        _heap_start = .;
        . += 0x100; /* Adjust the size as needed */
        _heap_end = .;
    } > RAM
}

/* Define symbols for memory initialization */
PROVIDE(_start = 0x00010000);
PROVIDE(_etext = _etext);
PROVIDE(_sdata = _sdata);
PROVIDE(_edata = _edata);
PROVIDE(_sbss = _sbss);
PROVIDE(_ebss = _ebss);
PROVIDE(_sstack = _sstack);
PROVIDE(_estack = _estack);