d76bbc9dfb37bce4bd0a6c9dc36cf5868eb10b05
[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 /* We're lying about our output format, so that grub thinks we are a 32 bit elf
9  * and just loads our sections.  Since we're getting loaded into low memory, it
10  * doesn't really matter (to grub) what our VMAs are.  Our LMAs are fine as
11  * either 32 or 64 bit. */
12 OUTPUT_FORMAT("elf32-i386", "elf32-i386", "elf32-i386")
13 OUTPUT_ARCH(i386:x86-64)
14 /* This is for a pure 64 bit elf: 
15 OUTPUT_FORMAT("elf64-x86-64", "elf64-x86-64", "elf64-x86-64")
16 */
17 ENTRY(_start)
18 KERN_LOAD_ADDR = 0xffffffffc0000000;
19
20 SECTIONS
21 {
22         /* Entry Linked and loaded at 0x00100000 (includes multiboot) */
23         . = 0x00100000;
24
25         .bootstrap : {
26                 *(.boottext .bootdata)
27         }
28
29         /* Link the main kernel for the space after entry + KERN_LOAD_ADDR.  We'll
30          * still load it adjacent in physical memory */
31         . += KERN_LOAD_ADDR;
32
33         .text : AT(ADDR(.text) - KERN_LOAD_ADDR) {
34                 *(.text .stub .text.* .gnu.linkonce.t.*)
35         }
36
37         PROVIDE(etext = .);     /* Define the 'etext' symbol to this value */
38
39         .rodata : {
40                 *(.rodata .rodata.* .gnu.linkonce.r.*)
41         }
42
43         /* TODO: add some debug info.  i hear stabs are 32 bit only, so we'll need
44          * to bring in some dwarves.  for now, hack in the symbols to compile. */
45         PROVIDE(__STAB_BEGIN__ = .);
46         PROVIDE(__STAB_END__ = .);
47         PROVIDE(__STABSTR_BEGIN__ = .);
48         PROVIDE(__STABSTR_END__ = .);
49
50         /* Adjust the address for the data segment to the next page */
51         . = ALIGN(0x1000);
52
53         /* The data segment */
54         .data : {
55                 *(.data)
56         }
57
58         PROVIDE(edata = .);
59
60         .bss : {
61                 *(.bss)
62                 *(COMMON)
63         }
64
65         PROVIDE(end = .);
66
67         /DISCARD/ : {
68                 *(.eh_frame .note.GNU-stack)
69         }
70 }