c9224cc0f78889d502e6568826d137ca836fea17
[akaros.git] / kern / arch / x86 / kernel64.ld
1 /* Simple linker script for the ROS kernel.
2    See the GNU ld 'info' manual ("info ld") to learn the syntax. */
3
4 /* This script needs to be invoked with -z max-page-size=0x1000.  Otherwise,
5  * ld will offset our first section to 1MB within the actual file.  Multiboot
6  * requires the header to be in the first two pages. */
7
8 OUTPUT_FORMAT("elf64-x86-64", "elf64-x86-64", "elf64-x86-64")
9 ENTRY(_start)
10 KERN_LOAD_ADDR = 0xffffffffc0000000;
11
12 SECTIONS
13 {
14         /* Entry Linked and loaded at 0x00100000 (includes multiboot) */
15         . = 0x00100000;
16
17         .bootstrap : {
18                 *(.boottext .bootdata .bootbss)
19         }
20
21         /* Needed this for syslinux, which was sitting around 16MB phys.  This just
22          * jumps us forward to the 32MB mark, both physically and virtually. */
23         . = 0x02000000;
24
25         /* Link the main kernel for the space after entry + KERN_LOAD_ADDR.  We'll
26          * still load it adjacent in physical memory */
27         . += KERN_LOAD_ADDR;
28
29         .text : AT(ADDR(.text) - KERN_LOAD_ADDR) {
30                 *(.text .stub .text.* .gnu.linkonce.t.*)
31                 PROVIDE(etext = .);     /* Define the 'etext' symbol to this value */
32         }
33
34         INCLUDE kern/linker_tables.ld
35         INCLUDE kern/build_id.ld
36
37         .rodata : {
38                 *(.rodata .rodata.* .gnu.linkonce.r.*)
39         }
40
41         /* Adjust the address for the data segment to the next page */
42         . = ALIGN(0x1000);
43
44         /* The data segment */
45         .data : {
46                 *(.data)
47         }
48
49         .bss : {
50                 PROVIDE(__start_bss = .);
51                 *(.bss)
52                 *(COMMON)
53                 PROVIDE(__stop_bss = .);
54         }
55
56         /* 'end' isn't a real section, but everything needs a name.  It'll show up
57          * as 'N' (debug) in the nm / ksyms.map output. */
58         .end : {
59                 PROVIDE(end = .);
60         }
61
62         /DISCARD/ : {
63                 *(.eh_frame .note.GNU-stack)
64         }
65 }