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