[PATCH v3 06/10] bsps/arm: Break out linker script for AArch64

Kinsey Moore kinsey.moore at oarcorp.com
Sun Oct 4 04:18:50 UTC 2020


This breaks out the common section of the ARM linker script that is
usable by AArch64 BSPs to avoid duplication of the vast majority. To do
so, it was necessary to add a new linker path at bsps/shared/start.
---
 bsps/arm/shared/start/linkcmds.base      | 381 +-------------------
 bsps/shared/start/linkcmds-aarch.base    | 420 +++++++++++++++++++++++
 spec/build/bsps/arm/grp.yml              |   1 +
 spec/build/bsps/optldflagsbsp.yml        |   1 +
 testsuites/aclocal/rtems-bsp-linkcmds.m4 |   2 +
 testsuites/automake/compile.am           |   1 +
 6 files changed, 426 insertions(+), 380 deletions(-)
 create mode 100644 bsps/shared/start/linkcmds-aarch.base

diff --git a/bsps/arm/shared/start/linkcmds.base b/bsps/arm/shared/start/linkcmds.base
index 1f5f1ef959..d0c88f50d8 100644
--- a/bsps/arm/shared/start/linkcmds.base
+++ b/bsps/arm/shared/start/linkcmds.base
@@ -24,19 +24,10 @@ OUTPUT_FORMAT ("elf32-littlearm", "elf32-bigarm", "elf32-littlearm")
 
 OUTPUT_ARCH (arm)
 
-ENTRY (_start)
-STARTUP (start.o)
-
 /*
  * Global symbols that may be defined externally
  */
 
-bsp_vector_table_size = DEFINED (bsp_vector_table_size) ? bsp_vector_table_size : 64;
-
-bsp_section_xbarrier_align = DEFINED (bsp_section_xbarrier_align) ? bsp_section_xbarrier_align : 1;
-bsp_section_robarrier_align = DEFINED (bsp_section_robarrier_align) ? bsp_section_robarrier_align : 1;
-bsp_section_rwbarrier_align = DEFINED (bsp_section_rwbarrier_align) ? bsp_section_rwbarrier_align : 1;
-
 bsp_stack_align = DEFINED (bsp_stack_align) ? bsp_stack_align : 8;
 
 bsp_stack_abt_size = DEFINED (bsp_stack_abt_size) ? bsp_stack_abt_size : 0;
@@ -48,374 +39,4 @@ bsp_stack_fiq_size = ALIGN (bsp_stack_fiq_size, bsp_stack_align);
 bsp_stack_und_size = DEFINED (bsp_stack_und_size) ? bsp_stack_und_size : 0;
 bsp_stack_und_size = ALIGN (bsp_stack_und_size, bsp_stack_align);
 
-bsp_stack_hyp_size = DEFINED (bsp_stack_hyp_size) ? bsp_stack_hyp_size : 0;
-bsp_stack_hyp_size = ALIGN (bsp_stack_hyp_size, bsp_stack_align);
-
-MEMORY {
-	UNEXPECTED_SECTIONS : ORIGIN = 0xffffffff, LENGTH = 0
-}
-
-SECTIONS {
-	.start : ALIGN_WITH_INPUT {
-		bsp_section_start_begin = .;
-		KEEP (*(.bsp_start_text))
-		KEEP (*(.bsp_start_data))
-		bsp_section_start_end = .;
-	} > REGION_START AT > REGION_START
-	bsp_section_start_size = bsp_section_start_end - bsp_section_start_begin;
-
-	.xbarrier : ALIGN_WITH_INPUT {
-		. = ALIGN (bsp_section_xbarrier_align);
-	} > REGION_VECTOR AT > REGION_VECTOR
-
-	.text : ALIGN_WITH_INPUT {
-		bsp_section_text_begin = .;
-		*(.text.unlikely .text.*_unlikely)
-		*(.text .stub .text.* .gnu.linkonce.t.*)
-		/* .gnu.warning sections are handled specially by elf32.em.  */
-		*(.gnu.warning)
-		*(.glue_7t) *(.glue_7) *(.vfp11_veneer) *(.v4_bx)
-	} > REGION_TEXT AT > REGION_TEXT_LOAD
-	.init : ALIGN_WITH_INPUT {
-		KEEP (*(.init))
-	} > REGION_TEXT AT > REGION_TEXT_LOAD
-	.fini : ALIGN_WITH_INPUT {
-		KEEP (*(.fini))
-		bsp_section_text_end = .;
-	} > REGION_TEXT AT > REGION_TEXT_LOAD
-	bsp_section_text_size = bsp_section_text_end - bsp_section_text_begin;
-	bsp_section_text_load_begin = LOADADDR (.text);
-	bsp_section_text_load_end = bsp_section_text_load_begin + bsp_section_text_size;
-
-	.robarrier : ALIGN_WITH_INPUT {
-		. = ALIGN (bsp_section_robarrier_align);
-	} > REGION_RODATA AT > REGION_RODATA
-
-	.rodata : ALIGN_WITH_INPUT {
-		bsp_section_rodata_begin = .;
-		*(.rodata .rodata.* .gnu.linkonce.r.*)
-	} > REGION_RODATA AT > REGION_RODATA_LOAD
-	.rodata1 : ALIGN_WITH_INPUT {
-		*(.rodata1)
-	} > REGION_RODATA AT > REGION_RODATA_LOAD
-	.ARM.extab : ALIGN_WITH_INPUT {
-		*(.ARM.extab* .gnu.linkonce.armextab.*)
-	} > REGION_RODATA AT > REGION_RODATA_LOAD
-	.ARM.exidx : ALIGN_WITH_INPUT {
-		__exidx_start = .;
-		*(.ARM.exidx* .gnu.linkonce.armexidx.*)
-		__exidx_end = .;
-	} > REGION_RODATA AT > REGION_RODATA_LOAD
-	.eh_frame : ALIGN_WITH_INPUT {
-		KEEP (*(.eh_frame))
-	} > REGION_RODATA AT > REGION_RODATA_LOAD
-	.gcc_except_table : ALIGN_WITH_INPUT {
-		*(.gcc_except_table .gcc_except_table.*)
-	} > REGION_RODATA AT > REGION_RODATA_LOAD
-	.tdata : ALIGN_WITH_INPUT {
-		_TLS_Data_begin = .;
-		*(.tdata .tdata.* .gnu.linkonce.td.*)
-		_TLS_Data_end = .;
-	} > REGION_RODATA AT > REGION_RODATA_LOAD
-	.tbss : ALIGN_WITH_INPUT {
-		_TLS_BSS_begin = .;
-		*(.tbss .tbss.* .gnu.linkonce.tb.*) *(.tcommon)
-		_TLS_BSS_end = .;
-	} > REGION_RODATA AT > REGION_RODATA_LOAD
-	_TLS_Data_size = _TLS_Data_end - _TLS_Data_begin;
-	_TLS_Data_begin = _TLS_Data_size != 0 ? _TLS_Data_begin : _TLS_BSS_begin;
-	_TLS_Data_end = _TLS_Data_size != 0 ? _TLS_Data_end : _TLS_BSS_begin;
-	_TLS_BSS_size = _TLS_BSS_end - _TLS_BSS_begin;
-	_TLS_Size = _TLS_BSS_end - _TLS_Data_begin;
-	_TLS_Alignment = MAX (ALIGNOF (.tdata), ALIGNOF (.tbss));
-	.preinit_array : ALIGN_WITH_INPUT {
-		PROVIDE_HIDDEN (__preinit_array_start = .);
-		KEEP (*(.preinit_array))
-		PROVIDE_HIDDEN (__preinit_array_end = .);
-	} > REGION_RODATA AT > REGION_RODATA_LOAD
-	.init_array : ALIGN_WITH_INPUT {
-		PROVIDE_HIDDEN (__init_array_start = .);
-		KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*)))
-		KEEP (*(.init_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .ctors))
-		PROVIDE_HIDDEN (__init_array_end = .);
-	} > REGION_RODATA AT > REGION_RODATA_LOAD
-	.fini_array : ALIGN_WITH_INPUT {
-		PROVIDE_HIDDEN (__fini_array_start = .);
-		KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*)))
-		KEEP (*(.fini_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .dtors))
-		PROVIDE_HIDDEN (__fini_array_end = .);
-	} > REGION_RODATA AT > REGION_RODATA_LOAD
-	.data.rel.ro : ALIGN_WITH_INPUT {
-		*(.data.rel.ro.local* .gnu.linkonce.d.rel.ro.local.*)
-		*(.data.rel.ro* .gnu.linkonce.d.rel.ro.*)
-	} > REGION_RODATA AT > REGION_RODATA_LOAD
-	.jcr : ALIGN_WITH_INPUT {
-		KEEP (*(.jcr))
-	} > REGION_RODATA AT > REGION_RODATA_LOAD
-	.interp : ALIGN_WITH_INPUT {
-		*(.interp)
-	} > REGION_RODATA AT > REGION_RODATA_LOAD
-	.note.gnu.build-id : ALIGN_WITH_INPUT {
-		*(.note.gnu.build-id)
-	} > REGION_RODATA AT > REGION_RODATA_LOAD
-	.hash : ALIGN_WITH_INPUT {
-		*(.hash)
-	} > REGION_RODATA AT > REGION_RODATA_LOAD
-	.gnu.hash : ALIGN_WITH_INPUT {
-		*(.gnu.hash)
-	} > REGION_RODATA AT > REGION_RODATA_LOAD
-	.dynsym : ALIGN_WITH_INPUT {
-		*(.dynsym)
-	} > REGION_RODATA AT > REGION_RODATA_LOAD
-	.dynstr : ALIGN_WITH_INPUT {
-		*(.dynstr)
-	} > REGION_RODATA AT > REGION_RODATA_LOAD
-	.gnu.version : ALIGN_WITH_INPUT {
-		*(.gnu.version)
-	} > REGION_RODATA AT > REGION_RODATA_LOAD
-	.gnu.version_d : ALIGN_WITH_INPUT {
-		*(.gnu.version_d)
-	} > REGION_RODATA AT > REGION_RODATA_LOAD
-	.gnu.version_r : ALIGN_WITH_INPUT {
-		*(.gnu.version_r)
-	} > REGION_RODATA AT > REGION_RODATA_LOAD
-	.rel.dyn : ALIGN_WITH_INPUT {
-		*(.rel.init)
-		*(.rel.text .rel.text.* .rel.gnu.linkonce.t.*)
-		*(.rel.fini)
-		*(.rel.rodata .rel.rodata.* .rel.gnu.linkonce.r.*)
-		*(.rel.data.rel.ro* .rel.gnu.linkonce.d.rel.ro.*)
-		*(.rel.data .rel.data.* .rel.gnu.linkonce.d.*)
-		*(.rel.tdata .rel.tdata.* .rel.gnu.linkonce.td.*)
-		*(.rel.tbss .rel.tbss.* .rel.gnu.linkonce.tb.*)
-		*(.rel.ctors)
-		*(.rel.dtors)
-		*(.rel.got)
-		*(.rel.bss .rel.bss.* .rel.gnu.linkonce.b.*)
-		PROVIDE_HIDDEN (__rel_iplt_start = .);
-		*(.rel.iplt)
-		PROVIDE_HIDDEN (__rel_iplt_end = .);
-		PROVIDE_HIDDEN (__rela_iplt_start = .);
-		PROVIDE_HIDDEN (__rela_iplt_end = .);
-	} > REGION_RODATA AT > REGION_RODATA_LOAD
-	.rela.dyn : ALIGN_WITH_INPUT {
-		*(.rela.init)
-		*(.rela.text .rela.text.* .rela.gnu.linkonce.t.*)
-		*(.rela.fini)
-		*(.rela.rodata .rela.rodata.* .rela.gnu.linkonce.r.*)
-		*(.rela.data .rela.data.* .rela.gnu.linkonce.d.*)
-		*(.rela.tdata .rela.tdata.* .rela.gnu.linkonce.td.*)
-		*(.rela.tbss .rela.tbss.* .rela.gnu.linkonce.tb.*)
-		*(.rela.ctors)
-		*(.rela.dtors)
-		*(.rela.got)
-		*(.rela.bss .rela.bss.* .rela.gnu.linkonce.b.*)
-		*(.rela.rtemsroset*)
-		*(.rela.rtemsrwset*)
-		PROVIDE_HIDDEN (__rel_iplt_start = .);
-		PROVIDE_HIDDEN (__rel_iplt_end = .);
-		PROVIDE_HIDDEN (__rela_iplt_start = .);
-		*(.rela.iplt)
-		PROVIDE_HIDDEN (__rela_iplt_end = .);
-	} > REGION_RODATA AT > REGION_RODATA_LOAD
-	.rel.plt : ALIGN_WITH_INPUT {
-		*(.rel.plt)
-	} > REGION_RODATA AT > REGION_RODATA_LOAD
-	.rela.plt : ALIGN_WITH_INPUT {
-		*(.rela.plt)
-	} > REGION_RODATA AT > REGION_RODATA_LOAD
-	.plt : ALIGN_WITH_INPUT {
-		*(.plt)
-	} > REGION_RODATA AT > REGION_RODATA_LOAD
-	.iplt : ALIGN_WITH_INPUT {
-		*(.iplt)
-	} > REGION_RODATA AT > REGION_RODATA_LOAD
-	.dynamic : ALIGN_WITH_INPUT {
-		*(.dynamic)
-	} > REGION_RODATA AT > REGION_RODATA_LOAD
-	.tm_clone_table : ALIGN_WITH_INPUT {
-		*(.tm_clone_table)
-	} > REGION_RODATA AT > REGION_RODATA_LOAD
-	.got : ALIGN_WITH_INPUT {
-		*(.got.plt) *(.igot.plt) *(.got) *(.igot)
-	} > REGION_RODATA AT > REGION_RODATA_LOAD
-	.rtemsroset : ALIGN_WITH_INPUT {
-		/* Special FreeBSD linker set sections */
-		__start_set_sysctl_set = .;
-		*(set_sysctl_*);
-		__stop_set_sysctl_set = .;
-		*(set_domain_*);
-		*(set_pseudo_*);
-
-		KEEP (*(SORT(.rtemsroset.*)))
-		bsp_section_rodata_end = .;
-	} > REGION_RODATA AT > REGION_RODATA_LOAD
-	bsp_section_rodata_size = bsp_section_rodata_end - bsp_section_rodata_begin;
-	bsp_section_rodata_load_begin = LOADADDR (.rodata);
-	bsp_section_rodata_load_end = bsp_section_rodata_load_begin + bsp_section_rodata_size;
-
-	.rwbarrier : ALIGN_WITH_INPUT {
-		. = ALIGN (bsp_section_rwbarrier_align);
-	} > REGION_DATA AT > REGION_DATA
-
-	.vector : ALIGN_WITH_INPUT {
-		bsp_section_vector_begin = .;
-		. = . + DEFINED (bsp_vector_table_in_start_section) ? 0 : bsp_vector_table_size;
-		bsp_section_vector_end = .;
-	} > REGION_VECTOR AT > REGION_VECTOR
-	bsp_section_vector_size = bsp_section_vector_end - bsp_section_vector_begin;
-	bsp_vector_table_begin = DEFINED (bsp_vector_table_in_start_section) ? bsp_section_start_begin : bsp_section_vector_begin;
-	bsp_vector_table_end = bsp_vector_table_begin + bsp_vector_table_size;
-
-	.fast_text : ALIGN_WITH_INPUT {
-		bsp_section_fast_text_begin = .;
-		*(.bsp_fast_text)
-		bsp_section_fast_text_end = .;
-	} > REGION_FAST_TEXT AT > REGION_FAST_TEXT_LOAD
-	bsp_section_fast_text_size = bsp_section_fast_text_end - bsp_section_fast_text_begin;
-	bsp_section_fast_text_load_begin = LOADADDR (.fast_text);
-	bsp_section_fast_text_load_end = bsp_section_fast_text_load_begin + bsp_section_fast_text_size;
-
-	.fast_data : ALIGN_WITH_INPUT {
-		bsp_section_fast_data_begin = .;
-		*(.bsp_fast_data)
-		bsp_section_fast_data_end = .;
-	} > REGION_FAST_DATA AT > REGION_FAST_DATA_LOAD
-	bsp_section_fast_data_size = bsp_section_fast_data_end - bsp_section_fast_data_begin;
-	bsp_section_fast_data_load_begin = LOADADDR (.fast_data);
-	bsp_section_fast_data_load_end = bsp_section_fast_data_load_begin + bsp_section_fast_data_size;
-
-	.data : ALIGN_WITH_INPUT {
-		bsp_section_data_begin = .;
-		*(.data .data.* .gnu.linkonce.d.*)
-		SORT(CONSTRUCTORS)
-	} > REGION_DATA AT > REGION_DATA_LOAD
-	.data1 : ALIGN_WITH_INPUT {
-		*(.data1)
-	} > REGION_DATA AT > REGION_DATA_LOAD
-	.rtemsrwset : ALIGN_WITH_INPUT {
-		KEEP (*(SORT(.rtemsrwset.*)))
-		bsp_section_data_end = .;
-	} > REGION_DATA AT > REGION_DATA_LOAD
-	bsp_section_data_size = bsp_section_data_end - bsp_section_data_begin;
-	bsp_section_data_load_begin = LOADADDR (.data);
-	bsp_section_data_load_end = bsp_section_data_load_begin + bsp_section_data_size;
-
-	.bss : ALIGN_WITH_INPUT {
-		bsp_section_bss_begin = .;
-		*(.dynbss)
-		*(.bss .bss.* .gnu.linkonce.b.*)
-		*(COMMON)
-		bsp_section_bss_end = .;
-	} > REGION_BSS AT > REGION_BSS
-	bsp_section_bss_size = bsp_section_bss_end - bsp_section_bss_begin;
-
-	.rtemsstack (NOLOAD) : ALIGN_WITH_INPUT {
-		bsp_section_rtemsstack_begin = .;
-		*(SORT_BY_ALIGNMENT (SORT_BY_NAME (.rtemsstack*)))
-		bsp_section_rtemsstack_end = .;
-	} > REGION_WORK AT > REGION_WORK
-	bsp_section_rtemsstack_size = bsp_section_rtemsstack_end - bsp_section_rtemsstack_begin;
-
-	.work : ALIGN_WITH_INPUT {
-		/*
-		 * The work section will occupy the remaining REGION_WORK region and
-		 * contains the RTEMS work space and heap.
-		 */
-		bsp_section_work_begin = .;
-		. += ORIGIN (REGION_WORK) + LENGTH (REGION_WORK) - ABSOLUTE (.);
-		bsp_section_work_end = .;
-	} > REGION_WORK AT > REGION_WORK
-	bsp_section_work_size = bsp_section_work_end - bsp_section_work_begin;
-
-	.stack : ALIGN_WITH_INPUT {
-		/*
-		 * The stack section will occupy the remaining REGION_STACK region and may
-		 * contain the task stacks.  Depending on the region distribution this
-		 * section may be of zero size.
-		 */
-		bsp_section_stack_begin = .;
-		. += ORIGIN (REGION_STACK) + LENGTH (REGION_STACK) - ABSOLUTE (.);
-		bsp_section_stack_end = .;
-	} > REGION_STACK AT > REGION_STACK
-	bsp_section_stack_size = bsp_section_stack_end - bsp_section_stack_begin;
-
-	.nocache : ALIGN_WITH_INPUT {
-		bsp_section_nocache_begin = .;
-		*(SORT_BY_ALIGNMENT (SORT_BY_NAME (.bsp_nocache*)))
-		bsp_section_nocache_end = .;
-	} > REGION_NOCACHE AT > REGION_NOCACHE_LOAD
-	bsp_section_nocache_size = bsp_section_nocache_end - bsp_section_nocache_begin;
-	bsp_section_nocache_load_begin = LOADADDR (.nocache);
-	bsp_section_nocache_load_end = bsp_section_nocache_load_begin + bsp_section_nocache_size;
-
-	.nocachenoload (NOLOAD) : ALIGN_WITH_INPUT {
-		bsp_section_nocachenoload_begin = .;
-		*(SORT_BY_ALIGNMENT (SORT_BY_NAME (.bsp_noload_nocache*)))
-		bsp_section_nocacheheap_begin = .;
-		. += ORIGIN (REGION_NOCACHE) + LENGTH (REGION_NOCACHE) - ABSOLUTE (.);
-		bsp_section_nocacheheap_end = .;
-		bsp_section_nocachenoload_end = .;
-	} > REGION_NOCACHE AT > REGION_NOCACHE
-	bsp_section_nocacheheap_size = bsp_section_nocacheheap_end - bsp_section_nocacheheap_begin;
-	bsp_section_nocachenoload_size = bsp_section_nocachenoload_end - bsp_section_nocachenoload_begin;
-
-	/* FIXME */
-	RamBase = ORIGIN (REGION_WORK);
-	RamSize = LENGTH (REGION_WORK);
-	RamEnd = RamBase + RamSize;
-	WorkAreaBase = bsp_section_work_begin;
-	HeapSize = 0;
-
-	/* Stabs debugging sections.  */
-	.stab          0 : { *(.stab) }
-	.stabstr       0 : { *(.stabstr) }
-	.stab.excl     0 : { *(.stab.excl) }
-	.stab.exclstr  0 : { *(.stab.exclstr) }
-	.stab.index    0 : { *(.stab.index) }
-	.stab.indexstr 0 : { *(.stab.indexstr) }
-	.comment       0 : { *(.comment) }
-	/* DWARF debug sections.
-	   Symbols in the DWARF debugging sections are relative to the beginning
-	   of the section so we begin them at 0.  */
-	/* DWARF 1 */
-	.debug          0 : { *(.debug) }
-	.line           0 : { *(.line) }
-	/* GNU DWARF 1 extensions */
-	.debug_srcinfo  0 : { *(.debug_srcinfo) }
-	.debug_sfnames  0 : { *(.debug_sfnames) }
-	/* DWARF 1.1 and DWARF 2 */
-	.debug_aranges  0 : { *(.debug_aranges) }
-	.debug_pubnames 0 : { *(.debug_pubnames) }
-	/* DWARF 2 */
-	.debug_info     0 : { *(.debug_info .gnu.linkonce.wi.*) }
-	.debug_abbrev   0 : { *(.debug_abbrev) }
-	.debug_line     0 : { *(.debug_line) }
-	.debug_frame    0 : { *(.debug_frame) }
-	.debug_str      0 : { *(.debug_str) }
-	.debug_loc      0 : { *(.debug_loc) }
-	.debug_macinfo  0 : { *(.debug_macinfo) }
-	/* SGI/MIPS DWARF 2 extensions */
-	.debug_weaknames 0 : { *(.debug_weaknames) }
-	.debug_funcnames 0 : { *(.debug_funcnames) }
-	.debug_typenames 0 : { *(.debug_typenames) }
-	.debug_varnames  0 : { *(.debug_varnames) }
-	/* DWARF 3 */
-	.debug_pubtypes 0 : { *(.debug_pubtypes) }
-	.debug_ranges   0 : { *(.debug_ranges) }
-	/* DWARF extension */
-	.debug_macro    0 : { *(.debug_macro) }
-	.ARM.attributes 0 : { KEEP (*(.ARM.attributes)) KEEP (*(.gnu.attributes)) }
-	.note.gnu.arm.ident 0 : { KEEP (*(.note.gnu.arm.ident)) }
-	/DISCARD/ : { *(.note.GNU-stack) *(.gnu_debuglink) *(.gnu.lto_*) }
-
-	/*
-	 * This is a RTEMS specific section to catch all unexpected input
-	 * sections.  In case you get an error like
-	 *   "section `.unexpected_sections' will not fit in region
-	 *   `UNEXPECTED_SECTIONS'"
-	 * you have to figure out the offending input section and add it to the
-	 * appropriate output section definition above.
-	 */
-	.unexpected_sections : { *(*) } > UNEXPECTED_SECTIONS
-}
+INCLUDE linkcmds-aarch.base
diff --git a/bsps/shared/start/linkcmds-aarch.base b/bsps/shared/start/linkcmds-aarch.base
new file mode 100644
index 0000000000..e69461a434
--- /dev/null
+++ b/bsps/shared/start/linkcmds-aarch.base
@@ -0,0 +1,420 @@
+/* SPDX-License-Identifier: BSD-2-Clause */
+
+/**
+ * @file
+ *
+ * @ingroup bsp_linker
+ *
+ * @brief Linker command base file for AArch32 and AArch64.
+ */
+
+/*
+ * Copyright (C) 2020 On-Line Applications Research Corporation (OAR)
+ * Written by Kinsey Moore <kinsey.moore at oarcorp.com>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+ENTRY (_start)
+STARTUP (start.o)
+
+/*
+ * Global symbols that may be defined externally
+ */
+
+bsp_vector_table_size = DEFINED (bsp_vector_table_size) ? bsp_vector_table_size : 64;
+
+bsp_section_xbarrier_align = DEFINED (bsp_section_xbarrier_align) ? bsp_section_xbarrier_align : 1;
+bsp_section_robarrier_align = DEFINED (bsp_section_robarrier_align) ? bsp_section_robarrier_align : 1;
+bsp_section_rwbarrier_align = DEFINED (bsp_section_rwbarrier_align) ? bsp_section_rwbarrier_align : 1;
+
+bsp_stack_hyp_size = DEFINED (bsp_stack_hyp_size) ? bsp_stack_hyp_size : 0;
+bsp_stack_hyp_size = ALIGN (bsp_stack_hyp_size, bsp_stack_align);
+
+MEMORY {
+	UNEXPECTED_SECTIONS : ORIGIN = 0xffffffff, LENGTH = 0
+}
+
+SECTIONS {
+	.start : ALIGN_WITH_INPUT {
+		bsp_section_start_begin = .;
+		KEEP (*(.bsp_start_text))
+		KEEP (*(.bsp_start_data))
+		bsp_section_start_end = .;
+	} > REGION_START AT > REGION_START
+	bsp_section_start_size = bsp_section_start_end - bsp_section_start_begin;
+
+	.xbarrier : ALIGN_WITH_INPUT {
+		. = ALIGN (bsp_section_xbarrier_align);
+	} > REGION_VECTOR AT > REGION_VECTOR
+
+	.text : ALIGN_WITH_INPUT {
+		bsp_section_text_begin = .;
+		*(.text.unlikely .text.*_unlikely)
+		*(.text .stub .text.* .gnu.linkonce.t.*)
+		/* .gnu.warning sections are handled specially by elf32.em.  */
+		*(.gnu.warning)
+		*(.glue_7t) *(.glue_7) *(.vfp11_veneer) *(.v4_bx)
+	} > REGION_TEXT AT > REGION_TEXT_LOAD
+	.init : ALIGN_WITH_INPUT {
+		KEEP (*(.init))
+	} > REGION_TEXT AT > REGION_TEXT_LOAD
+	.fini : ALIGN_WITH_INPUT {
+		KEEP (*(.fini))
+		bsp_section_text_end = .;
+	} > REGION_TEXT AT > REGION_TEXT_LOAD
+	bsp_section_text_size = bsp_section_text_end - bsp_section_text_begin;
+	bsp_section_text_load_begin = LOADADDR (.text);
+	bsp_section_text_load_end = bsp_section_text_load_begin + bsp_section_text_size;
+
+	.robarrier : ALIGN_WITH_INPUT {
+		. = ALIGN (bsp_section_robarrier_align);
+	} > REGION_RODATA AT > REGION_RODATA
+
+	.rodata : ALIGN_WITH_INPUT {
+		bsp_section_rodata_begin = .;
+		*(.rodata .rodata.* .gnu.linkonce.r.*)
+	} > REGION_RODATA AT > REGION_RODATA_LOAD
+	.rodata1 : ALIGN_WITH_INPUT {
+		*(.rodata1)
+	} > REGION_RODATA AT > REGION_RODATA_LOAD
+	.ARM.extab : ALIGN_WITH_INPUT {
+		*(.ARM.extab* .gnu.linkonce.armextab.*)
+	} > REGION_RODATA AT > REGION_RODATA_LOAD
+	.ARM.exidx : ALIGN_WITH_INPUT {
+		__exidx_start = .;
+		*(.ARM.exidx* .gnu.linkonce.armexidx.*)
+		__exidx_end = .;
+	} > REGION_RODATA AT > REGION_RODATA_LOAD
+	.eh_frame : ALIGN_WITH_INPUT {
+		KEEP (*(.eh_frame))
+	} > REGION_RODATA AT > REGION_RODATA_LOAD
+	.gcc_except_table : ALIGN_WITH_INPUT {
+		*(.gcc_except_table .gcc_except_table.*)
+	} > REGION_RODATA AT > REGION_RODATA_LOAD
+	.tdata : ALIGN_WITH_INPUT {
+		_TLS_Data_begin = .;
+		*(.tdata .tdata.* .gnu.linkonce.td.*)
+		_TLS_Data_end = .;
+	} > REGION_RODATA AT > REGION_RODATA_LOAD
+	.tbss : ALIGN_WITH_INPUT {
+		_TLS_BSS_begin = .;
+		*(.tbss .tbss.* .gnu.linkonce.tb.*) *(.tcommon)
+		_TLS_BSS_end = .;
+	} > REGION_RODATA AT > REGION_RODATA_LOAD
+	_TLS_Data_size = _TLS_Data_end - _TLS_Data_begin;
+	_TLS_Data_begin = _TLS_Data_size != 0 ? _TLS_Data_begin : _TLS_BSS_begin;
+	_TLS_Data_end = _TLS_Data_size != 0 ? _TLS_Data_end : _TLS_BSS_begin;
+	_TLS_BSS_size = _TLS_BSS_end - _TLS_BSS_begin;
+	_TLS_Size = _TLS_BSS_end - _TLS_Data_begin;
+	_TLS_Alignment = MAX (ALIGNOF (.tdata), ALIGNOF (.tbss));
+	.preinit_array : ALIGN_WITH_INPUT {
+		PROVIDE_HIDDEN (__preinit_array_start = .);
+		KEEP (*(.preinit_array))
+		PROVIDE_HIDDEN (__preinit_array_end = .);
+	} > REGION_RODATA AT > REGION_RODATA_LOAD
+	.init_array : ALIGN_WITH_INPUT {
+		PROVIDE_HIDDEN (__init_array_start = .);
+		KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*)))
+		KEEP (*(.init_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .ctors))
+		PROVIDE_HIDDEN (__init_array_end = .);
+	} > REGION_RODATA AT > REGION_RODATA_LOAD
+	.fini_array : ALIGN_WITH_INPUT {
+		PROVIDE_HIDDEN (__fini_array_start = .);
+		KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*)))
+		KEEP (*(.fini_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .dtors))
+		PROVIDE_HIDDEN (__fini_array_end = .);
+	} > REGION_RODATA AT > REGION_RODATA_LOAD
+	.data.rel.ro : ALIGN_WITH_INPUT {
+		*(.data.rel.ro.local* .gnu.linkonce.d.rel.ro.local.*)
+		*(.data.rel.ro* .gnu.linkonce.d.rel.ro.*)
+	} > REGION_RODATA AT > REGION_RODATA_LOAD
+	.jcr : ALIGN_WITH_INPUT {
+		KEEP (*(.jcr))
+	} > REGION_RODATA AT > REGION_RODATA_LOAD
+	.interp : ALIGN_WITH_INPUT {
+		*(.interp)
+	} > REGION_RODATA AT > REGION_RODATA_LOAD
+	.note.gnu.build-id : ALIGN_WITH_INPUT {
+		*(.note.gnu.build-id)
+	} > REGION_RODATA AT > REGION_RODATA_LOAD
+	.hash : ALIGN_WITH_INPUT {
+		*(.hash)
+	} > REGION_RODATA AT > REGION_RODATA_LOAD
+	.gnu.hash : ALIGN_WITH_INPUT {
+		*(.gnu.hash)
+	} > REGION_RODATA AT > REGION_RODATA_LOAD
+	.dynsym : ALIGN_WITH_INPUT {
+		*(.dynsym)
+	} > REGION_RODATA AT > REGION_RODATA_LOAD
+	.dynstr : ALIGN_WITH_INPUT {
+		*(.dynstr)
+	} > REGION_RODATA AT > REGION_RODATA_LOAD
+	.gnu.version : ALIGN_WITH_INPUT {
+		*(.gnu.version)
+	} > REGION_RODATA AT > REGION_RODATA_LOAD
+	.gnu.version_d : ALIGN_WITH_INPUT {
+		*(.gnu.version_d)
+	} > REGION_RODATA AT > REGION_RODATA_LOAD
+	.gnu.version_r : ALIGN_WITH_INPUT {
+		*(.gnu.version_r)
+	} > REGION_RODATA AT > REGION_RODATA_LOAD
+	.rel.dyn : ALIGN_WITH_INPUT {
+		*(.rel.init)
+		*(.rel.text .rel.text.* .rel.gnu.linkonce.t.*)
+		*(.rel.fini)
+		*(.rel.rodata .rel.rodata.* .rel.gnu.linkonce.r.*)
+		*(.rel.data.rel.ro* .rel.gnu.linkonce.d.rel.ro.*)
+		*(.rel.data .rel.data.* .rel.gnu.linkonce.d.*)
+		*(.rel.tdata .rel.tdata.* .rel.gnu.linkonce.td.*)
+		*(.rel.tbss .rel.tbss.* .rel.gnu.linkonce.tb.*)
+		*(.rel.ctors)
+		*(.rel.dtors)
+		*(.rel.got)
+		*(.rel.bss .rel.bss.* .rel.gnu.linkonce.b.*)
+		PROVIDE_HIDDEN (__rel_iplt_start = .);
+		*(.rel.iplt)
+		PROVIDE_HIDDEN (__rel_iplt_end = .);
+		PROVIDE_HIDDEN (__rela_iplt_start = .);
+		PROVIDE_HIDDEN (__rela_iplt_end = .);
+	} > REGION_RODATA AT > REGION_RODATA_LOAD
+	.rela.dyn : ALIGN_WITH_INPUT {
+		*(.rela.init)
+		*(.rela.text .rela.text.* .rela.gnu.linkonce.t.*)
+		*(.rela.fini)
+		*(.rela.rodata .rela.rodata.* .rela.gnu.linkonce.r.*)
+		*(.rela.data .rela.data.* .rela.gnu.linkonce.d.*)
+		*(.rela.tdata .rela.tdata.* .rela.gnu.linkonce.td.*)
+		*(.rela.tbss .rela.tbss.* .rela.gnu.linkonce.tb.*)
+		*(.rela.ctors)
+		*(.rela.dtors)
+		*(.rela.got)
+		*(.rela.bss .rela.bss.* .rela.gnu.linkonce.b.*)
+		*(.rela.rtemsroset*)
+		*(.rela.rtemsrwset*)
+		PROVIDE_HIDDEN (__rel_iplt_start = .);
+		PROVIDE_HIDDEN (__rel_iplt_end = .);
+		PROVIDE_HIDDEN (__rela_iplt_start = .);
+		*(.rela.iplt)
+		PROVIDE_HIDDEN (__rela_iplt_end = .);
+	} > REGION_RODATA AT > REGION_RODATA_LOAD
+	.rel.plt : ALIGN_WITH_INPUT {
+		*(.rel.plt)
+	} > REGION_RODATA AT > REGION_RODATA_LOAD
+	.rela.plt : ALIGN_WITH_INPUT {
+		*(.rela.plt)
+	} > REGION_RODATA AT > REGION_RODATA_LOAD
+	.plt : ALIGN_WITH_INPUT {
+		*(.plt)
+	} > REGION_RODATA AT > REGION_RODATA_LOAD
+	.iplt : ALIGN_WITH_INPUT {
+		*(.iplt)
+	} > REGION_RODATA AT > REGION_RODATA_LOAD
+	.dynamic : ALIGN_WITH_INPUT {
+		*(.dynamic)
+	} > REGION_RODATA AT > REGION_RODATA_LOAD
+	.tm_clone_table : ALIGN_WITH_INPUT {
+		*(.tm_clone_table)
+	} > REGION_RODATA AT > REGION_RODATA_LOAD
+	.got : ALIGN_WITH_INPUT {
+		*(.got.plt) *(.igot.plt) *(.got) *(.igot)
+	} > REGION_RODATA AT > REGION_RODATA_LOAD
+	.rtemsroset : ALIGN_WITH_INPUT SUBALIGN(4) {
+		/* Special FreeBSD linker set sections */
+		__start_set_sysctl_set = .;
+		*(set_sysctl_*);
+		__stop_set_sysctl_set = .;
+		*(set_domain_*);
+		*(set_pseudo_*);
+
+		KEEP (*(SORT(.rtemsroset.*)))
+		bsp_section_rodata_end = .;
+	} > REGION_RODATA AT > REGION_RODATA_LOAD
+	bsp_section_rodata_size = bsp_section_rodata_end - bsp_section_rodata_begin;
+	bsp_section_rodata_load_begin = LOADADDR (.rodata);
+	bsp_section_rodata_load_end = bsp_section_rodata_load_begin + bsp_section_rodata_size;
+
+	.rwbarrier : ALIGN_WITH_INPUT {
+		. = ALIGN (bsp_section_rwbarrier_align);
+	} > REGION_DATA AT > REGION_DATA
+
+	.vector : ALIGN_WITH_INPUT {
+		bsp_section_vector_begin = .;
+		. = . + DEFINED (bsp_vector_table_in_start_section) ? 0 : bsp_vector_table_size;
+		bsp_section_vector_end = .;
+	} > REGION_VECTOR AT > REGION_VECTOR
+	bsp_section_vector_size = bsp_section_vector_end - bsp_section_vector_begin;
+	bsp_vector_table_begin = DEFINED (bsp_vector_table_in_start_section) ? bsp_section_start_begin : bsp_section_vector_begin;
+	bsp_vector_table_end = bsp_vector_table_begin + bsp_vector_table_size;
+
+	.fast_text : ALIGN_WITH_INPUT {
+		bsp_section_fast_text_begin = .;
+		*(.bsp_fast_text)
+		bsp_section_fast_text_end = .;
+	} > REGION_FAST_TEXT AT > REGION_FAST_TEXT_LOAD
+	bsp_section_fast_text_size = bsp_section_fast_text_end - bsp_section_fast_text_begin;
+	bsp_section_fast_text_load_begin = LOADADDR (.fast_text);
+	bsp_section_fast_text_load_end = bsp_section_fast_text_load_begin + bsp_section_fast_text_size;
+
+	.fast_data : ALIGN_WITH_INPUT {
+		bsp_section_fast_data_begin = .;
+		*(.bsp_fast_data)
+		bsp_section_fast_data_end = .;
+	} > REGION_FAST_DATA AT > REGION_FAST_DATA_LOAD
+	bsp_section_fast_data_size = bsp_section_fast_data_end - bsp_section_fast_data_begin;
+	bsp_section_fast_data_load_begin = LOADADDR (.fast_data);
+	bsp_section_fast_data_load_end = bsp_section_fast_data_load_begin + bsp_section_fast_data_size;
+
+	.data : ALIGN_WITH_INPUT {
+		bsp_section_data_begin = .;
+		*(.data .data.* .gnu.linkonce.d.*)
+		SORT(CONSTRUCTORS)
+	} > REGION_DATA AT > REGION_DATA_LOAD
+	.data1 : ALIGN_WITH_INPUT {
+		*(.data1)
+	} > REGION_DATA AT > REGION_DATA_LOAD
+	.rtemsrwset : ALIGN_WITH_INPUT SUBALIGN(4) {
+		KEEP (*(SORT(.rtemsrwset.*)))
+		bsp_section_data_end = .;
+	} > REGION_DATA AT > REGION_DATA_LOAD
+	bsp_section_data_size = bsp_section_data_end - bsp_section_data_begin;
+	bsp_section_data_load_begin = LOADADDR (.data);
+	bsp_section_data_load_end = bsp_section_data_load_begin + bsp_section_data_size;
+
+	.bss : ALIGN_WITH_INPUT {
+		bsp_section_bss_begin = .;
+		*(.dynbss)
+		*(.bss .bss.* .gnu.linkonce.b.*)
+		*(COMMON)
+		bsp_section_bss_end = .;
+	} > REGION_BSS AT > REGION_BSS
+	bsp_section_bss_size = bsp_section_bss_end - bsp_section_bss_begin;
+
+	.rtemsstack (NOLOAD) : ALIGN_WITH_INPUT {
+		bsp_section_rtemsstack_begin = .;
+		*(SORT_BY_ALIGNMENT (SORT_BY_NAME (.rtemsstack*)))
+		bsp_section_rtemsstack_end = .;
+	} > REGION_WORK AT > REGION_WORK
+	bsp_section_rtemsstack_size = bsp_section_rtemsstack_end - bsp_section_rtemsstack_begin;
+
+	.work : ALIGN_WITH_INPUT {
+		/*
+		 * The work section will occupy the remaining REGION_WORK region and
+		 * contains the RTEMS work space and heap.
+		 */
+		bsp_section_work_begin = .;
+		. += ORIGIN (REGION_WORK) + LENGTH (REGION_WORK) - ABSOLUTE (.);
+		bsp_section_work_end = .;
+	} > REGION_WORK AT > REGION_WORK
+	bsp_section_work_size = bsp_section_work_end - bsp_section_work_begin;
+
+	.stack : ALIGN_WITH_INPUT {
+		/*
+		 * The stack section will occupy the remaining REGION_STACK region and may
+		 * contain the task stacks.  Depending on the region distribution this
+		 * section may be of zero size.
+		 */
+		bsp_section_stack_begin = .;
+		. += ORIGIN (REGION_STACK) + LENGTH (REGION_STACK) - ABSOLUTE (.);
+		bsp_section_stack_end = .;
+	} > REGION_STACK AT > REGION_STACK
+	bsp_section_stack_size = bsp_section_stack_end - bsp_section_stack_begin;
+
+	.nocache : ALIGN_WITH_INPUT {
+		bsp_section_nocache_begin = .;
+		*(SORT_BY_ALIGNMENT (SORT_BY_NAME (.bsp_nocache*)))
+		bsp_section_nocache_end = .;
+	} > REGION_NOCACHE AT > REGION_NOCACHE_LOAD
+	bsp_section_nocache_size = bsp_section_nocache_end - bsp_section_nocache_begin;
+	bsp_section_nocache_load_begin = LOADADDR (.nocache);
+	bsp_section_nocache_load_end = bsp_section_nocache_load_begin + bsp_section_nocache_size;
+
+	.nocachenoload (NOLOAD) : ALIGN_WITH_INPUT {
+		bsp_section_nocachenoload_begin = .;
+		*(SORT_BY_ALIGNMENT (SORT_BY_NAME (.bsp_noload_nocache*)))
+		bsp_section_nocacheheap_begin = .;
+		. += ORIGIN (REGION_NOCACHE) + LENGTH (REGION_NOCACHE) - ABSOLUTE (.);
+		bsp_section_nocacheheap_end = .;
+		bsp_section_nocachenoload_end = .;
+	} > REGION_NOCACHE AT > REGION_NOCACHE
+	bsp_section_nocacheheap_size = bsp_section_nocacheheap_end - bsp_section_nocacheheap_begin;
+	bsp_section_nocachenoload_size = bsp_section_nocachenoload_end - bsp_section_nocachenoload_begin;
+
+	/* FIXME */
+	RamBase = ORIGIN (REGION_WORK);
+	RamSize = LENGTH (REGION_WORK);
+	RamEnd = RamBase + RamSize;
+	WorkAreaBase = bsp_section_work_begin;
+	HeapSize = 0;
+
+	/* Stabs debugging sections.  */
+	.stab          0 : { *(.stab) }
+	.stabstr       0 : { *(.stabstr) }
+	.stab.excl     0 : { *(.stab.excl) }
+	.stab.exclstr  0 : { *(.stab.exclstr) }
+	.stab.index    0 : { *(.stab.index) }
+	.stab.indexstr 0 : { *(.stab.indexstr) }
+	.comment       0 : { *(.comment) }
+	/* DWARF debug sections.
+	   Symbols in the DWARF debugging sections are relative to the beginning
+	   of the section so we begin them at 0.  */
+	/* DWARF 1 */
+	.debug          0 : { *(.debug) }
+	.line           0 : { *(.line) }
+	/* GNU DWARF 1 extensions */
+	.debug_srcinfo  0 : { *(.debug_srcinfo) }
+	.debug_sfnames  0 : { *(.debug_sfnames) }
+	/* DWARF 1.1 and DWARF 2 */
+	.debug_aranges  0 : { *(.debug_aranges) }
+	.debug_pubnames 0 : { *(.debug_pubnames) }
+	/* DWARF 2 */
+	.debug_info     0 : { *(.debug_info .gnu.linkonce.wi.*) }
+	.debug_abbrev   0 : { *(.debug_abbrev) }
+	.debug_line     0 : { *(.debug_line) }
+	.debug_frame    0 : { *(.debug_frame) }
+	.debug_str      0 : { *(.debug_str) }
+	.debug_loc      0 : { *(.debug_loc) }
+	.debug_macinfo  0 : { *(.debug_macinfo) }
+	/* SGI/MIPS DWARF 2 extensions */
+	.debug_weaknames 0 : { *(.debug_weaknames) }
+	.debug_funcnames 0 : { *(.debug_funcnames) }
+	.debug_typenames 0 : { *(.debug_typenames) }
+	.debug_varnames  0 : { *(.debug_varnames) }
+	/* DWARF 3 */
+	.debug_pubtypes 0 : { *(.debug_pubtypes) }
+	.debug_ranges   0 : { *(.debug_ranges) }
+	/* DWARF extension */
+	.debug_macro    0 : { *(.debug_macro) }
+	.ARM.attributes 0 : { KEEP (*(.ARM.attributes)) KEEP (*(.gnu.attributes)) }
+	.note.gnu.arm.ident 0 : { KEEP (*(.note.gnu.arm.ident)) }
+	/DISCARD/ : { *(.note.GNU-stack) *(.gnu_debuglink) *(.gnu.lto_*) }
+
+	/*
+	 * This is a RTEMS specific section to catch all unexpected input
+	 * sections.  In case you get an error like
+	 *   "section `.unexpected_sections' will not fit in region
+	 *   `UNEXPECTED_SECTIONS'"
+	 * you have to figure out the offending input section and add it to the
+	 * appropriate output section definition above.
+	 */
+	.unexpected_sections : { *(*) } > UNEXPECTED_SECTIONS
+}
diff --git a/spec/build/bsps/arm/grp.yml b/spec/build/bsps/arm/grp.yml
index dd7694be83..5610b87b33 100644
--- a/spec/build/bsps/arm/grp.yml
+++ b/spec/build/bsps/arm/grp.yml
@@ -55,6 +55,7 @@ install:
   - bsps/arm/shared/start/linkcmds.armv4
   - bsps/arm/shared/start/linkcmds.armv7m
   - bsps/arm/shared/start/linkcmds.base
+  - bsps/shared/start/linkcmds-aarch.base
 ldflags: []
 links: []
 type: build
diff --git a/spec/build/bsps/optldflagsbsp.yml b/spec/build/bsps/optldflagsbsp.yml
index 74f15bd559..97ea71fec4 100644
--- a/spec/build/bsps/optldflagsbsp.yml
+++ b/spec/build/bsps/optldflagsbsp.yml
@@ -1,6 +1,7 @@
 SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
 actions:
 - set-value:
+  - -L${TOP}/bsps/shared/start
   - -L${TOP}/bsps/${ARCH}/shared/start
   - -L${TOP}/bsps/${ARCH}/${BSP_FAMILY}/start
 - substitute: null
diff --git a/testsuites/aclocal/rtems-bsp-linkcmds.m4 b/testsuites/aclocal/rtems-bsp-linkcmds.m4
index 0ad8867f9d..d5e7049e7f 100644
--- a/testsuites/aclocal/rtems-bsp-linkcmds.m4
+++ b/testsuites/aclocal/rtems-bsp-linkcmds.m4
@@ -18,8 +18,10 @@ AC_MSG_CHECKING([BSP linkcmds])
 
 RTEMS_BSP_ARCH_PATH="${RTEMS_SOURCE_ROOT}/bsps/${RTEMS_CPU}"
 RTEMS_BSP_ARCH_LINKCMDS_PATH="${RTEMS_BSP_ARCH_PATH}/shared/start"
+RTEMS_BSP_SHARED_LINKCMDS_PATH="${RTEMS_SOURCE_ROOT}/bsps/shared/start"
 RTEMS_BSP_LIBBSP_PATH="${RTEMS_BUILD_ROOT}/lib/libbsp/${RTEMS_CPU}/${RTEMS_BSP_FAMILY}"
 
 AC_SUBST(RTEMS_BSP_ARCH_LINKCMDS_PATH)
+AC_SUBST(RTEMS_BSP_SHARED_LINKCMDS_PATH)
 AC_SUBST(RTEMS_BSP_LIBBSP_PATH)
 ])
diff --git a/testsuites/automake/compile.am b/testsuites/automake/compile.am
index 66ea9a8421..e049e6db4b 100644
--- a/testsuites/automake/compile.am
+++ b/testsuites/automake/compile.am
@@ -20,6 +20,7 @@ AM_LDFLAGS += -B$(RTEMS_ROOT)lib/libbsp/@RTEMS_CPU@/@RTEMS_BSP_FAMILY@
 AM_LDFLAGS += $(GCCSPECS)
 AM_LDFLAGS += -L$(RTEMS_ROOT)cpukit
 AM_LDFLAGS += -L$(RTEMS_BSP_ARCH_LINKCMDS_PATH)
+AM_LDFLAGS += -L$(RTEMS_BSP_SHARED_LINKCMDS_PATH)
 AM_LDFLAGS += $(TEST_LD_FLAGS)
 
 LDADD =
-- 
2.20.1



More information about the devel mailing list