xref: /openbsd/sys/arch/i386/conf/ld.script (revision 3a759fb4)
1/*	$OpenBSD: ld.script,v 1.12 2021/03/07 23:10:54 mortimer 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 FLAGS (4);
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
44ENTRY(start)
45SECTIONS
46{
47	__kernel_text_virt = __kernel_base_virt;
48	__kernel_text_phys = __kernel_base_phys;
49	.text ALIGN(__kernel_text_virt, __ALIGN_SIZE) :
50	      AT (ALIGN(__kernel_text_phys, __ALIGN_SIZE))
51	{
52		__text_start = ABSOLUTE(.) & 0xfffff000;
53		__text_size = SIZEOF(.text);
54		__text_load = LOADADDR(.text);
55		locore0.o(.text)
56		*(.text .text.*)
57	} :text =0xcccccccc
58
59	. = ALIGN(__ALIGN_SIZE);
60	__kernel_kutext_phys = . & 0xfffffff;
61	.kutext : AT (__kernel_kutext_phys)
62	{
63		__kutext_start = ABSOLUTE(.);
64		*(.kutext)
65		__kutext_end = ABSOLUTE(.);
66	} :text =0xcccccccc
67
68	PROVIDE (__etext = .);
69	PROVIDE (etext = .);
70	_etext = .;
71
72	/* Move rodata to the next page, so we can nuke X and W bit on them */
73	. = ALIGN(__ALIGN_SIZE);
74	__kernel_rodata_virt = .;
75	__kernel_rodata_phys = . & 0xfffffff;
76	.rodata (__kernel_rodata_virt) : AT (__kernel_rodata_phys)
77	{
78		__rodata_start = ABSOLUTE(.);
79		__rodata_size = SIZEOF(.rodata);
80		__rodata_load = LOADADDR(.rodata);
81		*(.rodata .rodata.*)
82		*(.codepatch)
83		*(.codepatchend)
84	} :rodata =0xcccccccc
85	. = ALIGN(0x1000);
86	__kernel_randomdata_phys = . & 0xfffffff;
87	.openbsd.randomdata : AT (__kernel_randomdata_phys)
88	{
89		__retguard_start = ABSOLUTE(.);
90		*(.openbsd.randomdata.retguard .openbsd.randomdata.retguard.*)
91		/* XXX . = ALIGN(__ALIGN_SIZE); */
92		__retguard_end = ABSOLUTE(.);
93		*(.openbsd.randomdata .openbsd.randomdata.*)
94	} :rodata :openbsd_randomize =0xcccccccc
95	. = ALIGN(0x1000);
96	PROVIDE (erodata = .);
97	_erodata = .;
98
99	/* Move data to the next page, so we can add W bit on them */
100	. = ALIGN(__ALIGN_SIZE);
101	__kernel_data_virt = .;
102	__kernel_data_phys = . & 0xfffffff;
103	.data (__kernel_data_virt) : AT (__kernel_data_phys)
104	{
105		__data_start = ABSOLUTE(.);
106		__data_size = SIZEOF(.data);
107		__data_load = LOADADDR(.data);
108		*(.data .data.*)
109	} :data =0xcccccccc
110
111	. = ALIGN(__ALIGN_SIZE);
112	__kernel_kudata_phys = . & 0xfffffff;
113	.kudata : AT (__kernel_kudata_phys)
114	{
115		__kudata_start = ABSOLUTE(.);
116		*(.kudata)
117		__kudata_end = ABSOLUTE(.);
118	}
119
120	. = ALIGN(0x1000);
121	PROVIDE (edata = .);
122	_edata = .;
123
124	/* BSS starts right after padded data */
125	__kernel_bss_virt = .;
126	__kernel_bss_phys = . & 0xfffffff;
127	.bss (__kernel_bss_virt) : AT (__kernel_bss_phys)
128	{
129		__bss_start = ABSOLUTE(.);
130		__bss_size = SIZEOF(.bss);
131		__bss_load = LOADADDR(.bss);
132		*(.bss .bss.*)
133		*(COMMON)
134		/* Align after .bss to ensure correct alignment even if the
135		 * .bss section disappears because there are no input sections.
136		 */
137		. = ALIGN(0x1000);
138	} :bss
139	__kernel_bss_end = .;
140	. = ALIGN(0x1000);
141	_end = .;
142	PROVIDE (end = .);
143	__kernel_end_phys = . & 0xfffffff;
144
145	/* XXX - hack alert, since we are not C++, nuke these */
146	/DISCARD/ :
147	{
148		*(.note.GNU-stack)
149		*(.eh_frame)
150	}
151}
152