xref: /openbsd-src/sys/arch/i386/conf/ld.script (revision f2da64fbbbf1b03f09f390ab01267c93dfd77c4c)
1/*	$OpenBSD: ld.script,v 1.4 2016/09/03 13:13:07 deraadt Exp $	*/
2
3/*
4 * Copyright (c) 2015 Mike Larkin <mlarkin@openbsd.org>
5 * Copyright (c) 2009 Tobias Weingartner <weingart@tepid.org>
6 *
7 * Permission to use, copy, modify, and distribute this software for any
8 * purpose with or without fee is hereby granted, provided that the above
9 * copyright notice and this permission notice appear in all copies.
10 *
11 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
12 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
13 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
14 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
15 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
16 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
17 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18 */
19
20OUTPUT_FORMAT("elf32-i386", "elf32-i386", "elf32-i386")
21OUTPUT_ARCH(i386)
22
23/* Define how we want out ELF binary to look like. */
24PHDRS
25{
26	text PT_LOAD FILEHDR PHDRS;
27	rodata PT_LOAD;
28	data PT_LOAD;
29	bss PT_LOAD;
30	openbsd_randomize PT_OPENBSD_RANDOMIZE;
31}
32
33/*
34 * If we want the text/rodata/data sections aligned on 2M boundaries,
35 * we could use the following instead.  Note, file size would increase
36 * due to necessary padding.
37 *
38 *__ALIGN_SIZE = 0x200000;
39 */
40__ALIGN_SIZE = 0x1000;
41__kernel_base_virt = 0xd0200000 + SIZEOF_HEADERS;
42__kernel_base_phys = __kernel_base_virt & 0xfffffff;
43
44/* We use physical address to jump to kernel */
45start_phys = LOADADDR(.text) + (start - __kernel_base_virt);
46ENTRY(start_phys)
47SECTIONS
48{
49	__kernel_text_virt = __kernel_base_virt;
50	__kernel_text_phys = __kernel_base_phys;
51	.text (__kernel_text_virt) : AT (__kernel_text_phys)
52	{
53		__text_start = ABSOLUTE(.) & 0xfffff000;
54		__text_size = SIZEOF(.text);
55		__text_load = LOADADDR(.text);
56		locore.o(.text)
57		*(.text .text.*)
58	} :text
59	PROVIDE (__etext = .);
60	PROVIDE (etext = .);
61	_etext = .;
62
63	/* Move rodata to the next page, so we can nuke X and W bit on them */
64	. = ALIGN(__ALIGN_SIZE);
65	__kernel_rodata_virt = .;
66	__kernel_rodata_phys = . & 0xfffffff;
67	.rodata (__kernel_rodata_virt) : AT (__kernel_rodata_phys)
68	{
69		__rodata_start = ABSOLUTE(.);
70		__rodata_size = SIZEOF(.rodata);
71		__rodata_load = LOADADDR(.rodata);
72		*(.rodata .rodata.*)
73		*(.codepatch)
74		*(.codepatchend)
75	} :rodata
76	. = ALIGN(0x1000);
77	__kernel_randomdata_phys = . & 0xfffffff;
78	.openbsd.randomdata : AT (__kernel_randomdata_phys)
79	{
80		*(.openbsd.randomdata)
81	} :data :openbsd_randomize
82	. = ALIGN(0x1000);
83	PROVIDE (erodata = .);
84	_erodata = .;
85
86	/* Move data to the next page, so we can add W bit on them */
87	. = ALIGN(__ALIGN_SIZE);
88	__kernel_data_virt = .;
89	__kernel_data_phys = . & 0xfffffff;
90	.data (__kernel_data_virt) : AT (__kernel_data_phys)
91	{
92		__data_start = ABSOLUTE(.);
93		__data_size = SIZEOF(.data);
94		__data_load = LOADADDR(.data);
95		*(.data .data.*)
96	} :data
97	. = ALIGN(0x1000);
98	PROVIDE (edata = .);
99	_edata = .;
100
101	/* BSS starts right after padded data */
102	__kernel_bss_virt = .;
103	__kernel_bss_phys = . & 0xfffffff;
104	.bss (__kernel_bss_virt) : AT (__kernel_bss_phys)
105	{
106		__bss_start = ABSOLUTE(.);
107		__bss_size = SIZEOF(.bss);
108		__bss_load = LOADADDR(.bss);
109		*(.bss .bss.*)
110		*(COMMON)
111		/* Align after .bss to ensure correct alignment even if the
112		 * .bss section disappears because there are no input sections.
113		 */
114		. = ALIGN(0x1000);
115	} :bss
116	__kernel_bss_end = .;
117	. = ALIGN(0x1000);
118	_end = .;
119	PROVIDE (end = .);
120	__kernel_end_phys = . & 0xfffffff;
121
122	/* XXX - hack alert, since we are not C++, nuke these */
123	/DISCARD/ :
124	{
125		*(.note.GNU-stack)
126		*(.eh_frame)
127	}
128}
129