blob: e88a68cf62aa40c00c33619b6f403303bf3861f2 [file] [edit]
/*===----------------------------------------------------------------------===*
*
* Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
* See https://llvm.org/LICENSE.txt for license information.
* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
*
*===----------------------------------------------------------------------===*
*
* \file
* Bare-metal LLVM libc test linker script.
*
*===----------------------------------------------------------------------===*/
ASSERT(DEFINED(__boot_flash), "__boot_flash must be defined");
ASSERT(DEFINED(__boot_flash_size), "__boot_flash_size must be defined");
ASSERT(DEFINED(__flash), "__flash must be defined");
ASSERT(DEFINED(__flash_size), "__flash_size must be defined");
ASSERT(DEFINED(__ram), "__ram must be defined");
ASSERT(DEFINED(__ram_size), "__ram_size must be defined");
MEMORY {
boot_flash (rx) : ORIGIN = __boot_flash, LENGTH = __boot_flash_size
flash (rx) : ORIGIN = __flash, LENGTH = __flash_size
ram (rwx) : ORIGIN = __ram, LENGTH = __ram_size
}
SECTIONS {
PROVIDE(__stack = ORIGIN(ram) + LENGTH(ram));
.boot_flash : {
KEEP(*(.text.init.enter))
KEEP(*(.vectors))
KEEP(*(.vectors.*))
KEEP(*(.data.init.enter))
} > boot_flash
.text : ALIGN(8) {
KEEP(*(.text.startup .text.startup.*))
*(.text .text.* .gnu.linkonce.t.*)
} > flash
.preinit_array : ALIGN(8) {
KEEP(*(.preinit_array))
KEEP(*(.preinit_array.*))
} > flash
.init_array : ALIGN(8) {
KEEP(*(SORT_BY_INIT_PRIORITY(.init_array.*)))
KEEP(*(.init_array))
} > flash
.fini_array : ALIGN(8) {
KEEP(*(SORT_BY_INIT_PRIORITY(.fini_array.*)))
KEEP(*(.fini_array))
} > flash
.rodata : ALIGN(8) {
*(.rodata .rodata.* .gnu.linkonce.r.*)
*(.srodata .srodata.*)
*(.rdata)
} > flash
.eh_frame_hdr : ALIGN(4) {
*(.eh_frame_hdr)
*(.eh_frame_entry .eh_frame_entry.*)
} > flash
.eh_frame : ALIGN(4) {
KEEP(*(.eh_frame))
KEEP(*(.eh_frame.*))
} > flash
.ARM.extab : ALIGN(4) {
*(.ARM.extab* .gnu.linkonce.armextab.*)
} > flash
.ARM.exidx : ALIGN(4) {
*(.ARM.exidx* .gnu.linkonce.armexidx.*)
} > flash
.data : ALIGN(8) {
PROVIDE(__data_start = .);
*(.data .data.* .gnu.linkonce.d.*)
*(.sdata .sdata.* .gnu.linkonce.s.*)
. = ALIGN(8);
} > ram AT> flash
PROVIDE(__data_source = LOADADDR(.data));
PROVIDE(__data_size = SIZEOF(.data));
.bss (NOLOAD) : ALIGN(8) {
PROVIDE(__bss_start = .);
*(.sbss .sbss.* .gnu.linkonce.sb.*)
*(.bss .bss.* .gnu.linkonce.b.*)
*(COMMON)
. = ALIGN(8);
PROVIDE(__bss_size = . - __bss_start);
} > ram
.noinit (NOLOAD) : ALIGN(8) {
*(.noinit .noinit.*)
} > ram
PROVIDE(_end = .);
PROVIDE(__llvm_libc_heap_limit =
__stack - (DEFINED(__stack_size) ? __stack_size : 0));
.heap (NOLOAD) : {
. += (DEFINED(__heap_size_min) ? __heap_size_min : 0);
} > ram
.stack (NOLOAD) : {
. += (DEFINED(__stack_size) ? __stack_size : 0);
} > ram
/DISCARD/ : {
*(.note .note.*)
*(.comment)
}
}