xref: /openbsd-src/sys/arch/amd64/conf/ld.script (revision 4c5e57a2bb21e6f8963cca482c2e6a369211a6f7)
1/*	$OpenBSD: ld.script,v 1.19 2022/11/07 01:41:57 guenther Exp $	*/
2
3/*
4 * Copyright (c) 2009 Tobias Weingartner <weingart@tepid.org>
5 *
6 * Permission to use, copy, modify, and distribute this software for any
7 * purpose with or without fee is hereby granted, provided that the above
8 * copyright notice and this permission notice appear in all copies.
9 *
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17 */
18
19OUTPUT_FORMAT("elf64-x86-64", "elf64-x86-64", "elf64-x86-64")
20OUTPUT_ARCH(i386:x86-64)
21
22/* Define how we want out ELF binary to look like. */
23PHDRS
24{
25	text PT_LOAD FILEHDR PHDRS;
26	rodata PT_LOAD FLAGS (4);
27	data PT_LOAD;
28	bss PT_LOAD;
29	openbsd_randomize PT_OPENBSD_RANDOMIZE;
30}
31
32/*
33 * If we want the text/rodata/data sections aligned on 2M boundaries,
34 * we could use the following instead.  Note, file size would increase
35 * due to necessary padding.
36 *
37 *__ALIGN_SIZE = 0x200000;
38 */
39__ALIGN_SIZE = 0x1000;
40__kernel_base = 0xffffffff80000000;
41__kernel_virt_base = __kernel_base + 0x1000000;
42__kernel_phys_base = 0x1000000;
43__kernel_virt_to_phys = __kernel_phys_base - __kernel_virt_base;
44
45ENTRY(start)
46SECTIONS
47{
48	.text ALIGN(__kernel_virt_base + SIZEOF_HEADERS, __ALIGN_SIZE) :
49	      AT (ALIGN(__kernel_phys_base + SIZEOF_HEADERS, __ALIGN_SIZE))
50	{
51		start = .;
52		locore0.o(.text)
53		*(.text .text.*)
54		. = ALIGN(__ALIGN_SIZE);
55		__text_page_start = ABSOLUTE(.);
56		*(.ktext.page)
57		__text_page_end = ABSOLUTE(.);
58	} :text =0xcccccccc
59
60	. = ALIGN(__ALIGN_SIZE);
61	__kernel_kutext_phys = . + __kernel_virt_to_phys;
62	.kutext : AT (__kernel_kutext_phys)
63	{
64		__kutext_start = ABSOLUTE(.);
65		*(.kutext)
66		__kutext_end = ABSOLUTE(.);
67	} :text =0xcccccccc
68
69	. = ALIGN(__ALIGN_SIZE);
70	__kernel_cptext_phys = . + __kernel_virt_to_phys;
71	.cptext : AT (__kernel_cptext_phys)
72	{
73		__cptext_start = ABSOLUTE(.);
74		*(.cptext)
75		__cptext_end = ABSOLUTE(.);
76	} :text =0xcccccccc
77
78	PROVIDE (etext = .);
79	_etext = .;
80
81	/* Move rodata to the next page, so we can nuke X and W bit on them */
82	. = ALIGN(__ALIGN_SIZE);
83	__kernel_rodata_phys = . + __kernel_virt_to_phys;
84	.rodata : AT (__kernel_rodata_phys)
85	{
86		__rodata_start = ABSOLUTE(.);
87		*(.rodata .rodata.*)
88		. = ALIGN(8);
89		__nofault_start = ABSOLUTE(.);
90		*(.nofault.*) *(.nofault)
91		__nofault_end = ABSOLUTE(.);
92		*(.codepatch)
93		*(.codepatchend)
94	} :rodata =0xcccccccc
95
96	. = ALIGN(__ALIGN_SIZE);
97	__kernel_kutext_page_phys = . + __kernel_virt_to_phys;
98	.kutext.page : AT (__kernel_kutext_page_phys)
99	{
100		*(SORT_BY_ALIGNMENT(.kutext.page))
101	} :rodata =0xcccccccc
102
103	. = ALIGN(0x1000);
104	__kernel_randomdata_phys = . + __kernel_virt_to_phys;
105	.openbsd.randomdata : AT (__kernel_randomdata_phys)
106	{
107		__retguard_start = ABSOLUTE(.);
108		*(.openbsd.randomdata.retguard .openbsd.randomdata.retguard.*)
109		. = ALIGN(__ALIGN_SIZE);
110		__retguard_end = ABSOLUTE(.);
111		*(.openbsd.randomdata .openbsd.randomdata.*)
112	} :rodata :openbsd_randomize =0xcccccccc
113	. = ALIGN(0x1000);
114	PROVIDE (erodata = .);
115	_erodata = .;
116	/* Move data to the next page, so we can add W bit on them */
117	. = ALIGN(__ALIGN_SIZE);
118	__kernel_data_phys = . + __kernel_virt_to_phys;
119	.data : AT (__kernel_data_phys)
120	{
121		__data_start = ABSOLUTE(.);
122		*(.data .data.*)
123	} :data =0xcccccccc
124
125	. = ALIGN(__ALIGN_SIZE);
126	__kernel_kudata_phys = . + __kernel_virt_to_phys;
127	.kudata : AT (__kernel_kudata_phys)
128	{
129		__kudata_start = ABSOLUTE(.);
130		*(.kudata)
131		__kudata_end = ABSOLUTE(.);
132	} :data =0xcccccccc
133
134	. = ALIGN(0x1000);
135	PROVIDE (edata = .);
136	_edata = .;
137
138	/* BSS starts right after padded data */
139	__kernel_bss_phys = . + __kernel_virt_to_phys;
140	.bss : AT (__kernel_bss_phys)
141	{
142		*(.bss .bss.*)
143		*(COMMON)
144		/* Align after .bss to ensure correct alignment even if the
145		 * .bss section disappears because there are no input sections.
146		 */
147		. = ALIGN(0x1000);
148	} :bss
149	__kernel_bss_end = .;
150	. = ALIGN(0x200000);
151	_end = .;
152	PROVIDE (end = .);
153	__kernel_phys_end = . + __kernel_virt_to_phys;
154
155	/* XXX - hack alert, since we are not C++, nuke these */
156	/DISCARD/ :
157	{
158		*(.note.GNU-stack)
159		*(.eh_frame)
160	}
161}
162