diff options
Diffstat (limited to 'kernel/link.ld')
| -rw-r--r-- | kernel/link.ld | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/kernel/link.ld b/kernel/link.ld new file mode 100644 index 0000000..b61cd01 --- /dev/null +++ b/kernel/link.ld @@ -0,0 +1,54 @@ +OUTPUT_FORMAT(elf64-x86-64) +ENTRY(_start) + +KERNEL_BASE = 0xffffffff80000000; + +PHDRS +{ + text PT_LOAD; + rodata PT_LOAD; + data PT_LOAD; +} + +SECTIONS +{ + . = KERNEL_BASE; + .text : { + *(.text .text.*) + } : text + + . = ALIGN(CONSTANT(MAXPAGESIZE)); + + .rodata : { + *(.rodata .rodata.*) + } :rodata + + /* Add a .note.gnu.build-id output section in case a build ID flag is added to the */ + /* linker command. */ + .note.gnu.build-id : { + *(.note.gnu.build-id) + } :rodata + + /* Move to the next memory page for .data */ + . = ALIGN(CONSTANT(MAXPAGESIZE)); + + .data : { + *(.data .data.*) + } :data + + /* NOTE: .bss needs to be the last thing mapped to :data, otherwise lots of */ + /* unnecessary zeros will be written to the binary. */ + /* If you need, for example, .init_array and .fini_array, those should be placed */ + /* above this. */ + .bss : { + *(.bss .bss.*) + *(COMMON) + } :data + + /* Discard .note.* and .eh_frame* since they may cause issues on some hosts. */ + /DISCARD/ : { + *(.eh_frame*) + *(.note .note.*) + } +} + |
