Skip to content

Commit 57ab034

Browse files
tejlmandcfriedt
authored andcommitted
cmake: linker generator: group symbol from section
The root cause of #38591 was region symbols being placed before the section description for data region. Some region start symbols are placed before section description, other region start symbols are placed inside the first section in the region and thus identical to the sections own first symbol. To support both schemes with the linker generator, a new `SYMBOL SECTION` argument has been added to the zephyr_linker_group() function. The ld_script.cmake linker script generator has been updated to support the new argument so that generated ld linker script has identical behavior to the templated ld linker scripts. Signed-off-by: Torsten Rasmussen <[email protected]>
1 parent 15e834a commit 57ab034

File tree

3 files changed

+31
-5
lines changed

3 files changed

+31
-5
lines changed

cmake/extensions.cmake

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3083,8 +3083,8 @@ function(zephyr_linker_dts_memory)
30833083
endfunction()
30843084

30853085
# Usage:
3086-
# zephyr_linker_group(NAME <name> [VMA <region|group>] [LMA <region|group>])
3087-
# zephyr_linker_group(NAME <name> GROUP <group>)
3086+
# zephyr_linker_group(NAME <name> [VMA <region|group>] [LMA <region|group>] [SYMBOL <SECTION>])
3087+
# zephyr_linker_group(NAME <name> GROUP <group> [SYMBOL <SECTION>])
30883088
#
30893089
# Zephyr linker group.
30903090
# This function specifies a group inside a memory region or another group.
@@ -3108,6 +3108,8 @@ endfunction()
31083108
# If a group is used then the VMA region of that group will be used.
31093109
# LMA <region|group> : Memory region or group to be used for this group.
31103110
# GROUP <group> : Place the new group inside the existing group <group>
3111+
# SYMBOL <SECTION> : Specify that start symbol of the region should be identical
3112+
# to the start address of the first section in the group.
31113113
#
31123114
# Note: VMA and LMA are mutual exclusive with GROUP
31133115
#
@@ -3153,7 +3155,8 @@ endfunction()
31533155
# | |
31543156
# +---------------------+
31553157
function(zephyr_linker_group)
3156-
set(single_args "NAME;GROUP;LMA;VMA")
3158+
set(single_args "NAME;GROUP;LMA;SYMBOL;VMA")
3159+
set(symbol_values SECTION)
31573160
cmake_parse_arguments(GROUP "" "${single_args}" "" ${ARGN})
31583161

31593162
if(GROUP_UNPARSED_ARGUMENTS)
@@ -3168,6 +3171,12 @@ function(zephyr_linker_group)
31683171
)
31693172
endif()
31703173

3174+
if(DEFINED GROUP_SYMBOL)
3175+
if(NOT ${GROUP_SYMBOL} IN_LIST symbol_values)
3176+
message(FATAL_ERROR "zephyr_linker_group(SYMBOL ...) given unknown value")
3177+
endif()
3178+
endif()
3179+
31713180
set(GROUP)
31723181
zephyr_linker_arg_val_list(GROUP "${single_args}")
31733182

cmake/linker/ld/ld_script.cmake

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,13 +98,19 @@ function(group_to_string)
9898
set(${STRING_STRING} "${${STRING_STRING}}\n . = ${address};\n\n")
9999
else()
100100
get_property(name GLOBAL PROPERTY ${STRING_OBJECT}_NAME)
101+
get_property(symbol GLOBAL PROPERTY ${STRING_OBJECT}_SYMBOL)
101102
string(TOLOWER ${name} name)
102-
set(${STRING_STRING} "${${STRING_STRING}}\n __${name}_start = .;\n")
103103

104104
get_objects(LIST sections OBJECT ${STRING_OBJECT} TYPE SECTION)
105105
list(GET sections 0 section)
106106
get_property(first_section_name GLOBAL PROPERTY ${section}_NAME)
107107

108+
if(DEFINED first_section_name AND "${symbol}" STREQUAL "SECTION")
109+
set_property(GLOBAL APPEND PROPERTY ${section}_START_SYMBOLS __${name}_start)
110+
else()
111+
set(${STRING_STRING} "${${STRING_STRING}}\n __${name}_start = .;\n")
112+
endif()
113+
108114
set(${STRING_STRING} "${${STRING_STRING}}\n __${name}_size = __${name}_end - __${name}_start;\n")
109115
set(${STRING_STRING} "${${STRING_STRING}}\n __${name}_load_start = LOADADDR(${first_section_name});\n")
110116
endif()
@@ -178,6 +184,7 @@ function(section_to_string)
178184
get_property(noinit GLOBAL PROPERTY ${STRING_SECTION}_NOINIT)
179185
get_property(nosymbols GLOBAL PROPERTY ${STRING_SECTION}_NOSYMBOLS)
180186
get_property(parent GLOBAL PROPERTY ${STRING_SECTION}_PARENT)
187+
get_property(start_syms GLOBAL PROPERTY ${STRING_SECTION}_START_SYMBOLS)
181188

182189
string(REGEX REPLACE "^[\.]" "" name_clean "${name}")
183190
string(REPLACE "." "_" name_clean "${name_clean}")
@@ -204,6 +211,11 @@ function(section_to_string)
204211
endif()
205212

206213
set(TEMP "${name} ${address}${type} :${secalign}\n{")
214+
215+
foreach(start_symbol ${start_syms})
216+
set(TEMP "${TEMP}\n ${start_symbol} = .;")
217+
endforeach()
218+
207219
if(NOT nosymbols)
208220
set(TEMP "${TEMP}\n __${name_clean}_start = .;")
209221
endif()
@@ -273,6 +285,10 @@ function(section_to_string)
273285
set(TEMP "${TEMP}\n __${name_clean}_end = .;")
274286
endif()
275287

288+
if(DEFINED extra_symbol_end)
289+
set(TEMP "${TEMP}\n ${extra_symbol_end} = .;")
290+
endif()
291+
276292
set(TEMP "${TEMP}\n}")
277293

278294
get_property(parent_type GLOBAL PROPERTY ${parent}_OBJ_TYPE)

cmake/linker/linker_script_common.cmake

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,11 +58,12 @@ function(get_parent)
5858
endfunction()
5959

6060
function(create_group)
61-
cmake_parse_arguments(OBJECT "" "GROUP;LMA;NAME;OBJECT;VMA" "" ${ARGN})
61+
cmake_parse_arguments(OBJECT "" "GROUP;LMA;NAME;OBJECT;SYMBOL;VMA" "" ${ARGN})
6262

6363
set_property(GLOBAL PROPERTY GROUP_${OBJECT_NAME} TRUE)
6464
set_property(GLOBAL PROPERTY GROUP_${OBJECT_NAME}_OBJ_TYPE GROUP)
6565
set_property(GLOBAL PROPERTY GROUP_${OBJECT_NAME}_NAME ${OBJECT_NAME})
66+
set_property(GLOBAL PROPERTY GROUP_${OBJECT_NAME}_SYMBOL ${OBJECT_SYMBOL})
6667

6768
if(DEFINED OBJECT_GROUP)
6869
find_object(OBJECT parent NAME ${OBJECT_GROUP})

0 commit comments

Comments
 (0)