125 lines
2.9 KiB
Plaintext
125 lines
2.9 KiB
Plaintext
/*
|
|
* Copyright 2022 The Android Open Source Project
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* https://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
/*
|
|
* Code will start running at this symbol which is placed at the start of the
|
|
* image.
|
|
*/
|
|
ENTRY(entry)
|
|
|
|
/*
|
|
* The following would be useful to check that .init code is not called back
|
|
* into once it has completed but it isn't supported by ld.lld.
|
|
*
|
|
* NOCROSSREFS_TO(.init .text)
|
|
*/
|
|
|
|
SECTIONS
|
|
{
|
|
.dtb (NOLOAD) : {
|
|
dtb_begin = .;
|
|
. += LENGTH(dtb_region);
|
|
dtb_end = .;
|
|
} >dtb_region
|
|
|
|
/*
|
|
* Collect together the code. This is page aligned so it can be mapped
|
|
* as executable-only.
|
|
*/
|
|
.init : ALIGN(4096) {
|
|
text_begin = .;
|
|
*(.init.entry)
|
|
*(.init.*)
|
|
} >image
|
|
.text : {
|
|
*(.text.*)
|
|
} >image
|
|
text_end = .;
|
|
|
|
/*
|
|
* Collect together read-only data. This is page aligned so it can be
|
|
* mapped as read-only and non-executable.
|
|
*/
|
|
.rodata : ALIGN(4096) {
|
|
rodata_begin = .;
|
|
*(.rodata.*)
|
|
} >image
|
|
.got : {
|
|
*(.got)
|
|
} >image
|
|
rodata_end = .;
|
|
|
|
.eh_stack (NOLOAD) : ALIGN(4096) {
|
|
/*
|
|
* Get stack overflow guard from the previous page being from
|
|
* .rodata and mapped read-only or left unmapped.
|
|
*/
|
|
eh_stack_limit = .;
|
|
. += 4096;
|
|
. = ALIGN(4096);
|
|
init_eh_stack_pointer = .;
|
|
} >writable_data
|
|
|
|
/*
|
|
* Collect together the read-write data including .bss at the end which
|
|
* will be zero'd by the entry code. This is page aligned so it can be
|
|
* mapped as non-executable.
|
|
*/
|
|
.data : ALIGN(4096) {
|
|
data_begin = .;
|
|
*(.data.*)
|
|
/*
|
|
* The entry point code assumes that .data is a multiple of 32
|
|
* bytes long.
|
|
*/
|
|
. = ALIGN(32);
|
|
data_end = .;
|
|
} >writable_data AT>image
|
|
data_lma = LOADADDR(.data);
|
|
|
|
/* Everything beyond this point will not be included in the binary. */
|
|
bin_end = data_lma + SIZEOF(.data);
|
|
|
|
/* The entry point code assumes that .bss is 16-byte aligned. */
|
|
.bss : ALIGN(16) {
|
|
bss_begin = .;
|
|
*(.bss.*)
|
|
*(COMMON)
|
|
. = ALIGN(16);
|
|
bss_end = .;
|
|
} >writable_data
|
|
|
|
init_stack_pointer = ORIGIN(writable_data) + LENGTH(writable_data);
|
|
.stack (NOLOAD) : ALIGN(4096) {
|
|
. += 4096; /* Ensure we have one guard page for overflow. */
|
|
stack_limit = .;
|
|
. = init_stack_pointer;
|
|
} >writable_data
|
|
|
|
/*
|
|
* Remove unused sections from the image.
|
|
*/
|
|
/DISCARD/ : {
|
|
/* The image loads itself so doesn't need these sections. */
|
|
*(.gnu.hash)
|
|
*(.hash)
|
|
*(.interp)
|
|
*(.eh_frame_hdr)
|
|
*(.eh_frame)
|
|
*(.note.gnu.build-id)
|
|
}
|
|
}
|