summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorweingart <weingart@openbsd.org>2009-08-13 13:35:54 +0000
committerweingart <weingart@openbsd.org>2009-08-13 13:35:54 +0000
commit3b9a4dfe9268b8eb526e05668ca17d118017506c (patch)
tree8092b4d8632f5de4483153e82f6eccf49668cb5a
parentA new(er) mtx_enter_try(). (diff)
downloadwireguard-openbsd-3b9a4dfe9268b8eb526e05668ca17d118017506c.tar.xz
wireguard-openbsd-3b9a4dfe9268b8eb526e05668ca17d118017506c.zip
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@.
-rw-r--r--sys/arch/amd64/conf/Makefile.amd645
-rw-r--r--sys/arch/amd64/conf/kern.ldscript118
2 files changed, 120 insertions, 3 deletions
diff --git a/sys/arch/amd64/conf/Makefile.amd64 b/sys/arch/amd64/conf/Makefile.amd64
index 08d56696af2..94e4e35ab24 100644
--- a/sys/arch/amd64/conf/Makefile.amd64
+++ b/sys/arch/amd64/conf/Makefile.amd64
@@ -1,4 +1,4 @@
-# $OpenBSD: Makefile.amd64,v 1.18 2009/08/09 23:04:49 miod Exp $
+# $OpenBSD: Makefile.amd64,v 1.19 2009/08/13 13:35:54 weingart Exp $
# Makefile for OpenBSD
#
@@ -49,7 +49,7 @@ CMACHFLAGS+= -fno-stack-protector
COPTS?= -O2
CFLAGS= ${DEBUG} ${CDIAGFLAGS} ${CMACHFLAGS} ${COPTS} ${PIPE}
AFLAGS= -x assembler-with-cpp -D_LOCORE
-LINKFLAGS= -Ttext 0xffffffff801001e0 -e start -X
+LINKFLAGS= -T ${AMD64}/conf/kern.ldscript -X
STRIPFLAGS= -g -x
.if ${IDENT:M-DDDB_STRUCT}
@@ -99,7 +99,6 @@ SYSTEM_LD_TAIL= @${SIZE} $@; chmod 755 $@
DEBUG?=
.if ${DEBUG} == "-g"
-LINKFLAGS+= -X
SYSTEM_LD_TAIL+=; \
echo mv $@ $@.gdb; rm -f $@.gdb; mv $@ $@.gdb; \
echo ${STRIP} ${STRIPFLAGS} -o $@ $@.gdb; \
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)
+ }
+}
+