1# SPDX-License-Identifier: Apache-2.0
2# The contents of this file is based on include/zephyr/linker/common-rom.ld
3# and som of include/zephyr/linker/common-rom/*.ld
4# Please keep in sync
5
6zephyr_linker_section(NAME init KVMA RAM_REGION GROUP RODATA_REGION)
7zephyr_linker_section_obj_level(SECTION init LEVEL EARLY)
8zephyr_linker_section_obj_level(SECTION init LEVEL PRE_KERNEL_1)
9zephyr_linker_section_obj_level(SECTION init LEVEL PRE_KERNEL_2)
10zephyr_linker_section_obj_level(SECTION init LEVEL POST_KERNEL)
11zephyr_linker_section_obj_level(SECTION init LEVEL APPLICATION)
12zephyr_linker_section_obj_level(SECTION init LEVEL SMP)
13
14zephyr_iterable_section(NAME device NUMERIC KVMA RAM_REGION GROUP RODATA_REGION)
15
16if(CONFIG_GEN_SW_ISR_TABLE AND NOT CONFIG_SRAM_SW_ISR_TABLE)
17  # ld align has been changed to subalign to provide identical behavior scatter vs. ld.
18  zephyr_linker_section(NAME sw_isr_table KVMA FLASH GROUP RODATA_REGION SUBALIGN ${CONFIG_ARCH_SW_ISR_TABLE_ALIGN} NOINPUT)
19  zephyr_linker_section_configure(
20    SECTION sw_isr_table
21    INPUT ".gnu.linkonce.sw_isr_table*"
22  )
23  if(CONFIG_SHARED_INTERRUPTS)
24    zephyr_linker_section_configure(
25      SECTION sw_isr_table
26      INPUT ".gnu.linkonce.shared_sw_isr_table*"
27    )
28  endif()
29endif()
30
31zephyr_linker_section(NAME initlevel_error KVMA RAM_REGION GROUP RODATA_REGION NOINPUT)
32zephyr_linker_section_configure(SECTION initlevel_error INPUT ".z_init_*" KEEP SORT NAME)
33# How to do cross linker ?
34# ASSERT(SIZEOF(initlevel_error) == 0, "Undefined initialization levels used.")
35
36
37if(CONFIG_CPP)
38  zephyr_linker_section(NAME ctors KVMA RAM_REGION GROUP RODATA_REGION NOINPUT)
39  #
40  # The compiler fills the constructor pointers table below,
41  # hence symbol __CTOR_LIST__ must be aligned on word
42  # boundary. To align with the C++ standard, the first element
43  # of the array contains the number of actual constructors. The
44  # last element is NULL.
45  #
46# ToDo: Checkup on scatter loading. How to manage ?
47# https://www.keil.com/support/man/docs/armlink/armlink_pge1362066006368.htm
48# https://developer.arm.com/documentation/dui0378/g/The-ARM-C-and-C---Libraries
49#  if(CONFIG_64BIT)
50#		. = ALIGN(8);
51#		__CTOR_LIST__ = .;
52#		QUAD((__CTOR_END__ - __CTOR_LIST__) / 8 - 2)
53#		KEEP(*(SORT_BY_NAME(".ctors*")))
54#		QUAD(0)
55#		__CTOR_END__ = .;
56#  else()
57#		. = ALIGN(4);
58#		__CTOR_LIST__ = .;
59#		LONG((__CTOR_END__ - __CTOR_LIST__) / 4 - 2)
60#		KEEP(*(SORT_BY_NAME(".ctors*")))
61#		LONG(0)
62#		__CTOR_END__ = .;
63#  endif()
64#	} GROUP_ROM_LINK_IN(RAMABLE_REGION, ROMABLE_REGION)
65#
66#	SECTION_PROLOGUE(init_array,,)
67#	{
68#		. = ALIGN(4);
69#		__init_array_start = .;
70#		KEEP(*(SORT_BY_NAME(".init_array*")))
71#		__init_array_end = .;
72#	} GROUP_ROM_LINK_IN(RAMABLE_REGION, ROMABLE_REGION)
73endif()
74
75if(CONFIG_USERSPACE)
76  # Build-time assignment of permissions to kernel objects to
77  # threads declared with K_THREAD_DEFINE()
78  zephyr_iterable_section(NAME k_object_assignment VMA FLASH)
79endif()
80
81zephyr_linker_section(
82  NAME app_shmem_regions
83  KVMA RAM_REGION GROUP RODATA_REGION NOINPUT ${XIP_ALIGN_WITH_INPUT}
84)
85zephyr_linker_section_configure(
86  SECTION app_shmem_regions
87  INPUT ".app_regions.*"
88  KEEP SORT NAME
89)
90
91if(CONFIG_NETWORKING)
92  zephyr_iterable_section(NAME net_l3_register KVMA RAM_REGION GROUP RODATA_REGION)
93endif()
94
95if(CONFIG_NET_SOCKETS)
96  zephyr_iterable_section(NAME net_socket_register KVMA RAM_REGION GROUP RODATA_REGION)
97endif()
98
99
100if(CONFIG_NET_L2_PPP)
101  zephyr_iterable_section(NAME ppp_protocol_handler KVMA RAM_REGION GROUP RODATA_REGION)
102endif()
103
104zephyr_iterable_section(NAME bt_l2cap_fixed_chan KVMA RAM_REGION GROUP RODATA_REGION)
105
106if(CONFIG_BT_CLASSIC)
107  zephyr_iterable_section(NAME bt_l2cap_br_fixed_chan KVMA RAM_REGION GROUP RODATA_REGION)
108endif()
109
110if(CONFIG_BT_CONN)
111  zephyr_iterable_section(NAME bt_conn_cb KVMA RAM_REGION GROUP RODATA_REGION)
112endif()
113
114zephyr_iterable_section(NAME bt_gatt_service_static KVMA RAM_REGION GROUP RODATA_REGION)
115
116if(CONFIG_BT_MESH)
117  zephyr_iterable_section(NAME bt_mesh_subnet_cb KVMA RAM_REGION GROUP RODATA_REGION)
118  zephyr_iterable_section(NAME bt_mesh_app_key_cb KVMA RAM_REGION GROUP RODATA_REGION)
119
120  zephyr_iterable_section(NAME bt_mesh_hb_cb KVMA RAM_REGION GROUP RODATA_REGION)
121endif()
122
123if(CONFIG_BT_MESH_FRIEND)
124  zephyr_iterable_section(NAME bt_mesh_friend_cb KVMA RAM_REGION GROUP RODATA_REGION)
125endif()
126
127if(CONFIG_BT_MESH_LOW_POWER)
128  zephyr_iterable_section(NAME bt_mesh_lpn_cb KVMA RAM_REGION GROUP RODATA_REGION)
129endif()
130
131if(CONFIG_BT_MESH_PROXY)
132  zephyr_iterable_section(NAME bt_mesh_proxy_cb KVMA RAM_REGION GROUP RODATA_REGION)
133endif()
134
135if(CONFIG_EC_HOST_CMD)
136  zephyr_iterable_section(NAME ec_host_cmd_handler KVMA RAM_REGION GROUP RODATA_REGION)
137endif()
138
139if(CONFIG_SETTINGS)
140  zephyr_iterable_section(NAME settings_handler_static KVMA RAM_REGION GROUP RODATA_REGION)
141endif()
142
143if(CONFIG_SENSING)
144  zephyr_iterable_section(NAME sensing_sensor_info KVMA RAM_REGION GROUP RODATA_REGION)
145endif()
146
147if(CONFIG_SENSOR_INFO)
148  zephyr_iterable_section(NAME sensor_info KVMA RAM_REGION GROUP RODATA_REGION)
149endif()
150
151if(CONFIG_SENSOR_ASYNC_API)
152  zephyr_iterable_section(NAME sensor_decoder_api KVMA RAM_REGION GROUP RODATA_REGION)
153endif()
154
155if(CONFIG_MCUMGR)
156  zephyr_iterable_section(NAME mcumgr_handler KVMA RAM_REGION GROUP RODATA_REGION)
157endif()
158
159zephyr_iterable_section(NAME k_p4wq_initparam KVMA RAM_REGION GROUP RODATA_REGION)
160
161if(CONFIG_EMUL)
162  zephyr_iterable_section(NAME emul KVMA RAM_REGION GROUP RODATA_REGION)
163endif()
164
165if(CONFIG_DNS_SD)
166  zephyr_iterable_section(NAME dns_sd_rec KVMA RAM_REGION GROUP RODATA_REGION)
167endif()
168
169if(CONFIG_PCIE)
170  zephyr_iterable_section(NAME irq_alloc KVMA RAM_REGION GROUP RODATA_REGION)
171endif()
172
173zephyr_iterable_section(NAME log_strings KVMA RAM_REGION GROUP RODATA_REGION)
174
175zephyr_iterable_section(NAME log_const KVMA RAM_REGION GROUP RODATA_REGION)
176
177zephyr_linker_section(NAME symbol_to_keep GROUP RODATA_REGION NOINPUT)
178zephyr_linker_section_configure(SECTION symbol_to_keep INPUT ".symbol_to_keep*" KEEP SORT NAME)
179
180zephyr_iterable_section(NAME shell KVMA RAM_REGION GROUP RODATA_REGION)
181
182zephyr_iterable_section(NAME shell_root_cmds KVMA RAM_REGION GROUP RODATA_REGION)
183
184zephyr_iterable_section(NAME shell_subcmds KVMA RAM_REGION GROUP RODATA_REGION)
185
186zephyr_iterable_section(NAME shell_dynamic_subcmds KVMA RAM_REGION GROUP RODATA_REGION)
187
188zephyr_iterable_section(NAME cfb_font KVMA RAM_REGION GROUP RODATA_REGION)
189
190zephyr_iterable_section(NAME tracing_backend KVMA RAM_REGION GROUP RODATA_REGION)
191
192zephyr_linker_section(NAME zephyr_dbg_info KVMA RAM_REGION GROUP RODATA_REGION NOINPUT ${XIP_ALIGN_WITH_INPUT})
193zephyr_linker_section_configure(SECTION zephyr_dbg_info INPUT ".dbg_thread_info" KEEP)
194
195if(CONFIG_SYMTAB)
196  zephyr_linker_section(NAME symtab KVMA FLASH GROUP RODATA_REGION SUBALIGN 4 NOINPUT)
197  zephyr_linker_section_configure(SECTION symtab INPUT ".gnu.linkonce.symtab*")
198endif()
199
200if (CONFIG_DEVICE_DEPS)
201  zephyr_linker_section(NAME device_deps KVMA RAM_REGION GROUP RODATA_REGION NOINPUT ${XIP_ALIGN_WITH_INPUT} ENDALIGN 16)
202  zephyr_linker_section_configure(SECTION device_deps INPUT .__device_deps_pass1* KEEP SORT NAME PASS LINKER_DEVICE_DEPS_PASS1)
203  zephyr_linker_section_configure(SECTION device_deps INPUT .__device_deps_pass2* KEEP SORT NAME PASS NOT LINKER_DEVICE_DEPS_PASS1)
204endif()
205
206zephyr_iterable_section(NAME _static_thread_data KVMA RAM_REGION GROUP RODATA_REGION)
207
208if (CONFIG_BT_IAS)
209  zephyr_iterable_section(NAME bt_ias_cb KVMA RAM_REGION GROUP RODATA_REGION)
210endif()
211
212if (CONFIG_LOG)
213  zephyr_iterable_section(NAME log_link KVMA RAM_REGION GROUP RODATA_REGION)
214  zephyr_iterable_section(NAME log_backend KVMA RAM_REGION GROUP RODATA_REGION)
215endif()
216
217if (CONFIG_MULTI_LEVEL_INTERRUPTS)
218  zephyr_iterable_section(NAME intc_table KVMA RAM_REGION GROUP RODATA_REGION)
219endif()
220
221if (CONFIG_HTTP_SERVER)
222  zephyr_iterable_section(NAME http_service_desc KVMA RAM_REGION GROUP RODATA_REGION)
223endif()
224
225if (CONFIG_COAP_SERVER)
226  zephyr_iterable_section(NAME coap_service KVMA RAM_REGION GROUP RODATA_REGION)
227endif()
228
229if (CONFIG_NET_MGMT)
230  zephyr_iterable_section(NAME net_mgmt_event_static_handler KVMA RAM_REGION GROUP RODATA_REGION)
231endif()
232
233if(CONFIG_INPUT)
234  zephyr_iterable_section(NAME input_callback KVMA RAM_REGION GROUP RODATA_REGION)
235endif()
236
237if(CONFIG_USBD_MSC_CLASS)
238  zephyr_iterable_section(NAME usbd_msc_lun KVMA RAM_REGION GROUP RODATA_REGION)
239endif()
240
241if(CONFIG_ZTEST)
242  zephyr_iterable_section(NAME ztest_expected_result_entry KVMA RAM_REGION GROUP RODATA_REGION ${XIP_ALIGN_WITH_INPUT})
243  zephyr_iterable_section(NAME ztest_suite_node KVMA RAM_REGION GROUP RODATA_REGION ${XIP_ALIGN_WITH_INPUT})
244  zephyr_iterable_section(NAME ztest_unit_test KVMA RAM_REGION GROUP RODATA_REGION ${XIP_ALIGN_WITH_INPUT})
245  zephyr_iterable_section(NAME ztest_test_rule KVMA RAM_REGION GROUP RODATA_REGION ${XIP_ALIGN_WITH_INPUT})
246endif()
247
248if(CONFIG_ZBUS)
249  zephyr_iterable_section(NAME zbus_channel KVMA RAM_REGION GROUP RODATA_REGION)
250  zephyr_iterable_section(NAME zbus_observer KVMA RAM_REGION GROUP RODATA_REGION)
251  zephyr_iterable_section(NAME zbus_channel_observation KVMA RAM_REGION GROUP RODATA_REGION)
252endif()
253
254if(CONFIG_GNSS)
255  zephyr_iterable_section(NAME gnss_data_callback KVMA RAM_REGION GROUP RODATA_REGION)
256endif()
257
258if(CONFIG_GNSS_SATELLITES)
259  zephyr_iterable_section(NAME gnss_satellites_callback KVMA RAM_REGION GROUP RODATA_REGION)
260endif()
261
262if(CONFIG_GNSS_RTK)
263  zephyr_iterable_section(NAME gnss_rtk_data_callback KVMA RAM_REGION GROUP RODATA_REGION)
264endif()
265