NIX mode.
[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)
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         }
32
33         PROVIDE(etext = .);     /* Define the 'etext' symbol to this value */
34
35         INCLUDE kern/linker_tables.ld
36
37         .rodata : {
38                 *(.rodata .rodata.* .gnu.linkonce.r.*)
39         }
40
41         /* TODO: add some debug info.  i hear stabs are 32 bit only, so we'll need
42          * to bring in some dwarves.  for now, hack in the symbols to compile. */
43         PROVIDE(__STAB_BEGIN__ = .);
44         PROVIDE(__STAB_END__ = .);
45         PROVIDE(__STABSTR_BEGIN__ = .);
46         PROVIDE(__STABSTR_END__ = .);
47
48         /* Adjust the address for the data segment to the next page */
49         . = ALIGN(0x1000);
50
51         /* The data segment */
52         .data : {
53                 *(.data)
54         }
55
56         PROVIDE(edata = .);
57
58         .bss : {
59                 *(.bss)
60                 *(COMMON)
61         }
62
63         PROVIDE(end = .);
64
65         /DISCARD/ : {
66                 *(.eh_frame .note.GNU-stack)
67         }
68 }