aboutsummaryrefslogtreecommitdiff
path: root/i686/linker.ld
blob: 61a3be96889930a17e4fbe67ecf60b0364bd0977 (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
ENTRY(_start)
OUTPUT_FORMAT(elf32-i386)

MULTIBOOT_SIZE = 0x2000;
VADDR_BASE = 0xc0000000;

SECTIONS
{
    /* First put the multiboot header, as it is required to be put very early in the image or the bootloader won't    *
     * recognize the file format.                                                                                     *
     * Once the MMU is set up, this section is no longer needed and should be unmapped.                               */
    . = 0;
    .bootstrap : {
        . = ALIGN(8);
        __multiboot_begin = .;
        KEEP(*(.multiboot.header))
        KEEP(*(.multiboot.text))
        KEEP(*(.multiboot.pages))
        __multiboot_end = .;
    }

    . = VADDR_BASE;

    .text ALIGN(4K) : AT(ADDR(.text) - VADDR_BASE + MULTIBOOT_SIZE) {
        __text_begin = .;
        *(.text*)
        __text_end = .;
    }
 
    /* Read-only data. */
    .rodata ALIGN(4K) : AT(ADDR(.rodata) - VADDR_BASE + MULTIBOOT_SIZE) {
        __rodata_begin = .;
        *(.constinit)
        *(.rodata*)
        __rodata_end = .;
    }
 
    /* Read-write data (uninitialized) and stack */
    .bss ALIGN(4K) : AT(ADDR(.bss) - VADDR_BASE + MULTIBOOT_SIZE) {
        __bss_begin = .;
        *(.stack)
        *(.pages)
        *(.bss*)
        __bss_end = .;
    }

    /* Read-write data (initialized) */
    .data ALIGN(4K) : AT(ADDR(.data) - VADDR_BASE + MULTIBOOT_SIZE) {
        __data_begin = .;
        *(.init)
        *(.data)
        __data_end = .;
    }
}