This commit reworks the linker script generation and linking stages in order to better support fixed section location as required by #38836. Today we have the following generated linker scripts and the elf output depending on the system configuration: - linker_app_smem_unaligned.cmd --> app_smem_unaligned_prebuilt.elf - linker_zephyr_prebuilt.cmd --> zephyr_prebuilt.elf - linker.cmd --> zephyr.elf as not all linker scripts may be created and as there is a need for the possibility to move gen handles earlier then those stages has been renamed into more generic names so that with this commit we have: - linker_zephyr_pre0.cmd --> zephyr_pre0.elf - linker_zephyr_pre1.cmd --> zephyr_pre1.elf - linker.cmd --> zephyr.elf This also means that is the stage zephyr_pre1 is not needed, then build can go from `zephyr_pre0.elf` to `zephyr.elf`. The gen_handles.py has been changed so it now uses `zephyr_pre0.elf` as input. This ensures that the handles array are final when invoking the next build and linking stages. To keep the current behavior of generating the isr table and kobj hash of what was `zephyr_prebuilt` stage the code blocks contolling isr generation and kobj hash has been relocated to be located after app_smem and device handle generation. Signed-off-by: Jordan Yates <jordan.yates@data61.csiro.au> Signed-off-by: Torsten Rasmussen <Torsten.Rasmussen@nordicsemi.no>
228 lines
6 KiB
Text
228 lines
6 KiB
Text
/* SPDX-License-Identifier: Apache-2.0 */
|
|
|
|
SECTION_PROLOGUE(initlevel,,)
|
|
{
|
|
/*
|
|
* link in initialization objects for all objects that are
|
|
* automatically initialized by the kernel; the objects are
|
|
* sorted in the order they will be initialized (i.e. ordered
|
|
* by level, sorted by priority within a level)
|
|
*/
|
|
__init_start = .;
|
|
CREATE_OBJ_LEVEL(init, PRE_KERNEL_1)
|
|
CREATE_OBJ_LEVEL(init, PRE_KERNEL_2)
|
|
CREATE_OBJ_LEVEL(init, POST_KERNEL)
|
|
CREATE_OBJ_LEVEL(init, APPLICATION)
|
|
CREATE_OBJ_LEVEL(init, SMP)
|
|
__init_end = .;
|
|
} GROUP_ROM_LINK_IN(RAMABLE_REGION, ROMABLE_REGION)
|
|
|
|
SECTION_PROLOGUE(devices,,)
|
|
{
|
|
/* Link in devices objects, which are tied to the init ones;
|
|
* the objects are thus sorted the same way as their init
|
|
* object parent. See above and include/device.h.
|
|
*/
|
|
__device_start = .;
|
|
CREATE_OBJ_LEVEL(device, PRE_KERNEL_1)
|
|
CREATE_OBJ_LEVEL(device, PRE_KERNEL_2)
|
|
CREATE_OBJ_LEVEL(device, POST_KERNEL)
|
|
CREATE_OBJ_LEVEL(device, APPLICATION)
|
|
CREATE_OBJ_LEVEL(device, SMP)
|
|
__device_end = .;
|
|
} GROUP_ROM_LINK_IN(RAMABLE_REGION, ROMABLE_REGION)
|
|
|
|
#if defined(CONFIG_GEN_SW_ISR_TABLE) && !defined(CONFIG_DYNAMIC_INTERRUPTS)
|
|
SECTION_PROLOGUE(sw_isr_table,,)
|
|
{
|
|
/*
|
|
* Some arch requires an entry to be aligned to arch
|
|
* specific boundary for using double word load
|
|
* instruction. See include/sw_isr_table.h.
|
|
*/
|
|
. = ALIGN(CONFIG_ARCH_SW_ISR_TABLE_ALIGN);
|
|
*(_SW_ISR_TABLE_SECTION_SYMS)
|
|
} GROUP_ROM_LINK_IN(RAMABLE_REGION, ROMABLE_REGION)
|
|
#endif
|
|
|
|
/* verify we don't have rogue .z_init_<something> initlevel sections */
|
|
SECTION_PROLOGUE(initlevel_error,,)
|
|
{
|
|
KEEP(*(SORT(.z_init_[_A-Z0-9]*)))
|
|
}
|
|
ASSERT(SIZEOF(initlevel_error) == 0, "Undefined initialization levels used.")
|
|
|
|
#ifdef CONFIG_CPP_STATIC_INIT_GNU
|
|
SECTION_PROLOGUE(_CTOR_SECTION_NAME,,)
|
|
{
|
|
/*
|
|
* The compiler fills the constructor pointers table below,
|
|
* hence symbol __CTOR_LIST__ must be aligned on word
|
|
* boundary. To align with the C++ standard, the first elment
|
|
* of the array contains the number of actual constructors. The
|
|
* last element is NULL.
|
|
*/
|
|
#ifdef CONFIG_64BIT
|
|
. = ALIGN(8);
|
|
__CTOR_LIST__ = .;
|
|
QUAD((__CTOR_END__ - __CTOR_LIST__) / 8 - 2)
|
|
KEEP(*(SORT_BY_NAME(".ctors*")))
|
|
QUAD(0)
|
|
__CTOR_END__ = .;
|
|
#else
|
|
. = ALIGN(4);
|
|
__CTOR_LIST__ = .;
|
|
LONG((__CTOR_END__ - __CTOR_LIST__) / 4 - 2)
|
|
KEEP(*(SORT_BY_NAME(".ctors*")))
|
|
LONG(0)
|
|
__CTOR_END__ = .;
|
|
#endif
|
|
} GROUP_ROM_LINK_IN(RAMABLE_REGION, ROMABLE_REGION)
|
|
|
|
SECTION_PROLOGUE(init_array,,)
|
|
{
|
|
. = ALIGN(4);
|
|
__init_array_start = .;
|
|
KEEP(*(SORT_BY_NAME(".init_array*")))
|
|
__init_array_end = .;
|
|
} GROUP_ROM_LINK_IN(RAMABLE_REGION, ROMABLE_REGION)
|
|
#endif
|
|
#ifdef CONFIG_USERSPACE
|
|
/* Build-time assignment of permissions to kernel objects to
|
|
* threads declared with K_THREAD_DEFINE()
|
|
*/
|
|
ITERABLE_SECTION_ROM(z_object_assignment, 4)
|
|
#endif
|
|
|
|
SECTION_DATA_PROLOGUE(app_shmem_regions,,)
|
|
{
|
|
__app_shmem_regions_start = .;
|
|
KEEP(*(SORT(.app_regions.*)));
|
|
__app_shmem_regions_end = .;
|
|
} GROUP_ROM_LINK_IN(RAMABLE_REGION, ROMABLE_REGION)
|
|
|
|
#if defined(CONFIG_NET_SOCKETS)
|
|
ITERABLE_SECTION_ROM(net_socket_register, 4)
|
|
#endif
|
|
|
|
#if defined(CONFIG_NET_L2_PPP)
|
|
ITERABLE_SECTION_ROM(ppp_protocol_handler, 4)
|
|
#endif
|
|
|
|
ITERABLE_SECTION_ROM(bt_l2cap_fixed_chan, 4)
|
|
|
|
#if defined(CONFIG_BT_BREDR)
|
|
ITERABLE_SECTION_ROM(bt_l2cap_br_fixed_chan, 4)
|
|
#endif
|
|
|
|
#if defined(CONFIG_BT_CONN)
|
|
ITERABLE_SECTION_ROM(bt_conn_cb, 4)
|
|
#endif
|
|
|
|
ITERABLE_SECTION_ROM(bt_gatt_service_static, 4)
|
|
|
|
#if defined(CONFIG_BT_MESH)
|
|
ITERABLE_SECTION_ROM(bt_mesh_subnet_cb, 4)
|
|
ITERABLE_SECTION_ROM(bt_mesh_app_key_cb, 4)
|
|
|
|
ITERABLE_SECTION_ROM(bt_mesh_hb_cb, 4)
|
|
#endif
|
|
|
|
#if defined(CONFIG_BT_MESH_FRIEND)
|
|
ITERABLE_SECTION_ROM(bt_mesh_friend_cb, 4)
|
|
#endif
|
|
|
|
#if defined(CONFIG_BT_MESH_LOW_POWER)
|
|
ITERABLE_SECTION_ROM(bt_mesh_lpn_cb, 4)
|
|
#endif
|
|
|
|
#if defined(CONFIG_BT_MESH_GATT_PROXY)
|
|
ITERABLE_SECTION_ROM(bt_mesh_proxy_cb, 4)
|
|
#endif
|
|
|
|
#if defined(CONFIG_EC_HOST_CMD)
|
|
ITERABLE_SECTION_ROM(ec_host_cmd_handler, 4)
|
|
#endif
|
|
|
|
#if defined(CONFIG_SETTINGS)
|
|
ITERABLE_SECTION_ROM(settings_handler_static, 4)
|
|
#endif
|
|
|
|
ITERABLE_SECTION_ROM(k_p4wq_initparam, 4)
|
|
|
|
#if defined(CONFIG_EMUL)
|
|
SECTION_DATA_PROLOGUE(emulators_section,,)
|
|
{
|
|
__emul_list_start = .;
|
|
KEEP(*(SORT_BY_NAME(".emulators")));
|
|
__emul_list_end = .;
|
|
} GROUP_LINK_IN(ROMABLE_REGION)
|
|
#endif /* CONFIG_EMUL */
|
|
|
|
#if defined(CONFIG_DNS_SD)
|
|
ITERABLE_SECTION_ROM(dns_sd_rec, 4)
|
|
#endif
|
|
|
|
#if defined(CONFIG_PCIE)
|
|
SECTION_DATA_PROLOGUE(irq_alloc,,)
|
|
{
|
|
__irq_alloc_start = .;
|
|
KEEP(*(SORT_BY_NAME("._irq_alloc*")));
|
|
__irq_alloc_end = .;
|
|
} GROUP_LINK_IN(ROMABLE_REGION)
|
|
#endif /* CONFIG_PCIE */
|
|
|
|
SECTION_DATA_PROLOGUE(log_strings_sections,,)
|
|
{
|
|
__log_strings_start = .;
|
|
KEEP(*(SORT(.log_strings*)));
|
|
__log_strings_end = .;
|
|
} GROUP_ROM_LINK_IN(RAMABLE_REGION, ROMABLE_REGION)
|
|
|
|
SECTION_DATA_PROLOGUE(log_const_sections,,)
|
|
{
|
|
__log_const_start = .;
|
|
KEEP(*(SORT(.log_const_*)));
|
|
__log_const_end = .;
|
|
} GROUP_ROM_LINK_IN(RAMABLE_REGION, ROMABLE_REGION)
|
|
|
|
SECTION_DATA_PROLOGUE(log_backends_sections,,)
|
|
{
|
|
__log_backends_start = .;
|
|
KEEP(*("._log_backend.*"));
|
|
__log_backends_end = .;
|
|
} GROUP_ROM_LINK_IN(RAMABLE_REGION, ROMABLE_REGION)
|
|
|
|
ITERABLE_SECTION_ROM(shell, 4)
|
|
|
|
SECTION_DATA_PROLOGUE(shell_root_cmds_sections,,)
|
|
{
|
|
__shell_root_cmds_start = .;
|
|
KEEP(*(SORT(.shell_root_cmd_*)));
|
|
__shell_root_cmds_end = .;
|
|
} GROUP_ROM_LINK_IN(RAMABLE_REGION, ROMABLE_REGION)
|
|
|
|
SECTION_DATA_PROLOGUE(font_entry_sections,,)
|
|
{
|
|
__font_entry_start = .;
|
|
KEEP(*(SORT_BY_NAME("._cfb_font.*")))
|
|
__font_entry_end = .;
|
|
} GROUP_ROM_LINK_IN(RAMABLE_REGION, ROMABLE_REGION)
|
|
|
|
ITERABLE_SECTION_ROM(tracing_backend, 4)
|
|
|
|
SECTION_DATA_PROLOGUE(zephyr_dbg_info,,)
|
|
{
|
|
KEEP(*(".dbg_thread_info"));
|
|
} GROUP_ROM_LINK_IN(RAMABLE_REGION, ROMABLE_REGION)
|
|
|
|
SECTION_DATA_PROLOGUE(device_handles,,)
|
|
{
|
|
__device_handles_start = .;
|
|
#ifdef LINKER_DEVICE_HANDLES_PASS1
|
|
KEEP(*(SORT(.__device_handles_pass1*)));
|
|
#else
|
|
KEEP(*(SORT(.__device_handles_pass2*)));
|
|
#endif /* LINKER_DEVICE_HANDLES_PASS1 */
|
|
__device_handles_end = .;
|
|
} GROUP_ROM_LINK_IN(RAMABLE_REGION, ROMABLE_REGION)
|