1/*
2 * Copyright 2022 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *     https://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17/*
18 * Code will start running at this symbol which is placed at the start of the
19 * image.
20 */
21ENTRY(entry)
22
23/*
24 * The following would be useful to check that .init code is not called back
25 * into once it has completed but it isn't supported by ld.lld.
26 *
27 * NOCROSSREFS_TO(.init .text)
28 */
29
30SECTIONS
31{
32	/*
33	 * Collect together the code. This is page aligned so it can be mapped
34	 * as executable-only.
35	 */
36	.text : ALIGN(4096) {
37		KEEP(*(.init.head));
38		*(.init.head)
39		text_begin = .;
40		*(.init.entry)
41		*(.init.*)
42		*(.text.*)
43	} >image
44	text_end = .;
45
46	/*
47	 * Collect together read-only data. This is page aligned so it can be
48	 * mapped as read-only and non-executable.
49	 */
50	.rodata : ALIGN(4096) {
51		rodata_begin = .;
52		*(.rodata.*)
53	} >image
54	.got : {
55		*(.got)
56	} >image
57	rodata_end = .;
58
59	/*
60	 * Collect together the read-write data including .bss at the end which
61	 * will be zero'd by the entry code. This is page aligned so it can be
62	 * mapped as non-executable.
63	 */
64	.data : ALIGN(4096) {
65		data_begin = .;
66		*(.data.*)
67		/*
68		 * The entry point code assumes that .data is a multiple of 32
69		 * bytes long.
70		 */
71		. = ALIGN(32);
72		data_end = .;
73	} >writable_data AT>image
74	data_lma = LOADADDR(.data);
75
76	/* Everything beyond this point will not be included in the binary. */
77	bin_end = data_lma + SIZEOF(.data);
78
79	/* Data may be appended at load time to our binary. */
80	.image_footer (NOLOAD) : ALIGN(4096) {
81		image_footer_begin = .;
82		. = ALIGN(LENGTH(image));
83		image_footer_end = .;
84	} >image
85
86	/* The entry point code assumes that .bss is 16-byte aligned. */
87	.bss : ALIGN(16)  {
88		bss_begin = .;
89		*(.bss.*)
90		*(COMMON)
91		. = ALIGN(16);
92		bss_end = .;
93	} >writable_data
94
95	/* Left unmapped, to catch overflows of the exception handler stack. */
96	.eh_stack_guard_page (NOLOAD) : ALIGN(4096) {
97		. += 4096;
98	} >writable_data
99
100	/* Exception handler stack, mapped read-write. */
101	.eh_stack (NOLOAD) : ALIGN(4096) {
102		eh_stack_limit = .;
103		. += 4096;
104		init_eh_stack_pointer = .;
105	} >writable_data
106
107	/* Left unmapped, to catch overflows of the stack. */
108	.stack_guard_page (NOLOAD) : ALIGN(4096) {
109		. += 4096;
110	} >writable_data
111
112	/* Stack, mapped read-write (possibly partially). */
113	.stack (NOLOAD) : ALIGN(4096) {
114		stack_limit = .;
115		. = ALIGN(LENGTH(writable_data));
116		init_stack_pointer = .;
117	} >writable_data
118
119	/* Make our Bionic stack protector compatible with mainline LLVM */
120	__stack_chk_guard = __bionic_tls + 40;
121
122	/*
123	 * Remove unused sections from the image.
124	 */
125	/DISCARD/ : {
126		/* The image loads itself so doesn't need these sections. */
127		*(.gnu.hash)
128		*(.hash)
129		*(.interp)
130		*(.eh_frame_hdr)
131		*(.eh_frame)
132		*(.note.gnu.build-id)
133	}
134}
135
136/*
137 * Make calling the limit_stack_size!() macro optional by providing a default.
138 */
139PROVIDE(vmbase_stack_limit = DEFINED(vmbase_stack_limit_client) ?
140                                     vmbase_stack_limit_client :
141                                     vmbase_stack_limit_default);
142