Fixes bug with 64 bit linkage
[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         /* Link the main kernel for the space after entry + KERN_LOAD_ADDR.  We'll
22          * still load it adjacent in physical memory */
23         . += KERN_LOAD_ADDR;
24
25         .text : AT(ADDR(.text) - KERN_LOAD_ADDR) {
26                 *(.text .stub .text.* .gnu.linkonce.t.*)
27         }
28
29         PROVIDE(etext = .);     /* Define the 'etext' symbol to this value */
30
31         .rodata : {
32                 *(.rodata .rodata.* .gnu.linkonce.r.*)
33         }
34
35         /* TODO: add some debug info.  i hear stabs are 32 bit only, so we'll need
36          * to bring in some dwarves.  for now, hack in the symbols to compile. */
37         PROVIDE(__STAB_BEGIN__ = .);
38         PROVIDE(__STAB_END__ = .);
39         PROVIDE(__STABSTR_BEGIN__ = .);
40         PROVIDE(__STABSTR_END__ = .);
41
42         /* Adjust the address for the data segment to the next page */
43         . = ALIGN(0x1000);
44
45         /* The data segment */
46         .data : {
47                 *(.data)
48         }
49
50         PROVIDE(edata = .);
51
52         .bss : {
53                 *(.bss)
54                 *(COMMON)
55         }
56
57         PROVIDE(end = .);
58
59         /DISCARD/ : {
60                 *(.eh_frame .note.GNU-stack)
61         }
62 }