summaryrefslogtreecommitdiffstats
path: root/kernel/linker.ld
blob: 9a0561b9620a6133ef1d00354fc8bee86a586252 (plain) (blame)
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
68
69
70
71
72
73
74
75
76
77
INCLUDE memory.ld

ENTRY(_start)

/*Pass this symbols via CMake*/
MAGIC = 0x1BADB002;
FLAGS = 0;
CHECKSUM = -(MAGIC + FLAGS);

SECTIONS
{
    /* It's a raw solution. */
    /* Automatic generation of filling .multiboot section needs. */
    .multiboot ALIGN(START_ADDR, CONSTANT(MAXPAGESIZE)) : ALIGN(CONSTANT(MAXPAGESIZE))
    {
        LONG(MAGIC);
        LONG(FLAGS);
        LONG(CHECKSUM)
    } > REGION_MULTIBOOT

    .text ALIGN(CONSTANT(MAXPAGESIZE)) : ALIGN(CONSTANT(MAXPAGESIZE))
    {
        _text = .;
        *(.text*)
        _etext = .;
    } > REGION_TEXT

    .rodata ALIGN(CONSTANT(MAXPAGESIZE)): ALIGN(CONSTANT(MAXPAGESIZE))
    {
        _rodata = .;
        *(.rodata*)
        _erodata = .;
    } > REGION_RODATA

    .data :
    {
        _data = .;
        *(.data)
        _edata = .;
    } > REGION_DATA

    .bss :
    {
        _bss = .;
        *(.bss)
        *(COMMON)
        _ebss = .;
    } > REGION_BSS

    .stack ALIGN(CONSTANT(MAXPAGESIZE)) : ALIGN(CONSTANT(MAXPAGESIZE))
    {
        _stack = ABSOLUTE(.);
        . += 4 * CONSTANT(MAXPAGESIZE);
        _estack = ABSOLUTE(.);
    } > REGION_DATA

    .kheap ALIGN(CONSTANT(MAXPAGESIZE)) : ALIGN(CONSTANT(MAXPAGESIZE))
    {
        _startKheap = ABSOLUTE(.);
        . += CONSTANT(MAXPAGESIZE);
        _endKheap = ABSOLUTE(.);
    } > REGION_DATA

    .eh_frame :
    {
        _eh_frame = .;
        *(.eh_frame)
        _e_eh_frame = .;
    } > REGION_COMMON

    .ctors :
    {
        SORT_BY_NAME(CONSTRUCTORS)
    } > REGION_COMMON


}