summaryrefslogtreecommitdiff
path: root/kernel/link.ld
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/link.ld')
-rw-r--r--kernel/link.ld54
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.*)
+ }
+}
+