summaryrefslogtreecommitdiff
path: root/kernel.ld
blob: 11dc98fc1944d14edf9dc30699ccdd57bb2a1773 (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
OUTPUT_FORMAT("elf64-x86-64", "elf64-x86-64", "elf64-x86-64")
OUTPUT_ARCH(i386:x86-64)

SECTIONS
{
	. = 0xFFFFFF0000100000;
	PROVIDE(text = .);
	.text : AT(0x100000) {
		*(.text .stub .text.* .gnu.linkonce.t.*)
	}
	.rodata : {
		*(.rodata .rodata.* .gnu.linkonce.r.*)
	}

	/* Include debugging information in kernel memory */
	.stab : {
		PROVIDE(__STAB_BEGIN__ = .);
		*(.stab);
		PROVIDE(__STAB_END__ = .);
		BYTE(0)		/* Force the linker to allocate space
				   for this section */
	}

	.stabstr : {
		PROVIDE(__STABSTR_BEGIN__ = .);
		*(.stabstr);
		PROVIDE(__STABSTR_END__ = .);
		BYTE(0)		/* Force the linker to allocate space
				   for this section */
	}

	. = ALIGN(0x1000);

        /* Conventionally, Unix linkers provide pseudo-symbols
         * etext, edata, and end, at the end of the text, data, and bss.
         * For the kernel mapping, we need the address at the beginning
         * of the data section, but that's not one of the conventional
         * symbols, because the convention started before there was a
         * read-only rodata section between text and data. */
        PROVIDE(data = .);
	.data : {
		*(.data)
	}
	bss : {
		PROVIDE(edata = .);
		*(.bss)
		*(COMMON)
		PROVIDE(end = .);
	}
}