summaryrefslogtreecommitdiff
path: root/sys/arch/amd64/conf/kern.ldscript
diff options
context:
space:
mode:
authorTobias Weingartner <weingart@cvs.openbsd.org>2009-08-13 13:35:55 +0000
committerTobias Weingartner <weingart@cvs.openbsd.org>2009-08-13 13:35:55 +0000
commite8cfd3a0106e99f6e0e37e2306725af7d57c1687 (patch)
treed06dfeb0bc6175ab402cb48bc907dcfc56621811 /sys/arch/amd64/conf/kern.ldscript
parent12e07bde626971f0b6038b2e0779443ce161e178 (diff)
Start using a linking script for this kernel. This
should help in future using large pages for text/etc. Also, since we do not use the .eh frame stuff, we can nuke them, saving some bytes... Ok kettenis@, "more control over linking is a good thing, but I can't comment further" art@.
Diffstat (limited to 'sys/arch/amd64/conf/kern.ldscript')
-rw-r--r--sys/arch/amd64/conf/kern.ldscript118
1 files changed, 118 insertions, 0 deletions
diff --git a/sys/arch/amd64/conf/kern.ldscript b/sys/arch/amd64/conf/kern.ldscript
new file mode 100644
index 00000000000..9e9a9794c24
--- /dev/null
+++ b/sys/arch/amd64/conf/kern.ldscript
@@ -0,0 +1,118 @@
+/* $OpenBSD: kern.ldscript,v 1.1 2009/08/13 13:35:54 weingart Exp $ */
+
+/*
+ * Copyright (c) 2009 Tobias Weingartner <weingart@tepid.org>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+OUTPUT_FORMAT("elf64-x86-64", "elf64-x86-64", "elf64-x86-64")
+OUTPUT_ARCH(i386:x86-64)
+
+/* Define how we want out ELF binary to look like. */
+PHDRS
+{
+ text PT_LOAD FILEHDR PHDRS;
+ rodata PT_LOAD;
+ data PT_LOAD;
+ bss PT_LOAD;
+}
+
+/*
+ * If we want the text/rodata/data sections aligned on 2M boundaries,
+ * we could use the following instead. Note, file size would increase
+ * due to necessary padding.
+ *
+ *__ALIGN_SIZE = 0x200000;
+ */
+__ALIGN_SIZE = 0x1000;
+__kernel_base_virt = 0xffffffff80100000 + SIZEOF_HEADERS;
+__kernel_base_phys = __kernel_base_virt & 0x7fffffff;
+
+/* We use physical address to jump to kernel */
+start_phys = LOADADDR(.text) + (start - __kernel_base_virt);
+ENTRY(start_phys)
+SECTIONS
+{
+ __kernel_text_virt = __kernel_base_virt;
+ __kernel_text_phys = __kernel_base_phys;
+ .text (__kernel_text_virt) : AT (__kernel_text_phys)
+ {
+ __text_start = ABSOLUTE(.) & 0xfffffffffffff000;
+ __text_size = SIZEOF(.text);
+ __text_load = LOADADDR(.text);
+ locore.o(.text)
+ *(.text .text.*)
+ } :text
+ PROVIDE (__etext = .);
+ PROVIDE (etext = .);
+ _etext = .;
+
+ /* Move rodata to the next page, so we can nuke X and W bit on them */
+ . = ALIGN(__ALIGN_SIZE);
+ __kernel_rodata_virt = .;
+ __kernel_rodata_phys = . & 0x7fffffff;
+ .rodata (__kernel_rodata_virt) : AT (__kernel_rodata_phys)
+ {
+ __rodata_start = ABSOLUTE(.);
+ __rodata_size = SIZEOF(.rodata);
+ __rodata_load = LOADADDR(.rodata);
+ *(.rodata .rodata.*)
+ } :rodata
+ PROVIDE (erodata = .);
+ _erodata = .;
+
+ /* Move data to the next page, so we can add W bit on them */
+ . = ALIGN(__ALIGN_SIZE);
+ __kernel_data_virt = .;
+ __kernel_data_phys = . & 0x7fffffff;
+ .data (__kernel_data_virt) : AT (__kernel_data_phys)
+ {
+ __data_start = ABSOLUTE(.);
+ __data_size = SIZEOF(.data);
+ __data_load = LOADADDR(.data);
+ *(.data .data.*)
+ } :data
+ . = ALIGN(0x1000);
+ PROVIDE (edata = .);
+ _edata = .;
+
+ /* BSS starts right after padded data */
+ __kernel_bss_virt = .;
+ __kernel_bss_phys = . & 0x7fffffff;
+ .bss (__kernel_bss_virt) : AT (__kernel_bss_phys)
+ {
+ __bss_start = ABSOLUTE(.);
+ __bss_size = SIZEOF(.bss);
+ __bss_load = LOADADDR(.bss);
+ *(.bss .bss.*)
+ *(COMMON)
+ /* Align here to ensure that the .bss section occupies space
+ * up to _end. Align after .bss to ensure correct alignment
+ * even if the .bss section disappears because there are no
+ * input sections.
+ */
+ . = ALIGN(64 / 8);
+ } :bss
+ . = ALIGN(64 / 8);
+ _end = .;
+ PROVIDE (end = .);
+
+ /* XXX - hack alert, since we are not C++, nuke these */
+ /DISCARD/ :
+ {
+ *(.note.GNU-stack)
+ *(.eh_frame)
+ }
+}
+