Primary Git Repository for the Zephyr Project. Zephyr is a new generation, scalable, optimized, secure RTOS for multiple hardware architectures.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

141 lines
4.9 KiB

# Copyright (c) 2025 IAR Systems AB
#
# SPDX-License-Identifier: Apache-2.0
set_property(TARGET linker PROPERTY devices_start_symbol "_device_list_start")
find_program(CMAKE_LINKER
NAMES ${CROSS_COMPILE}${IAR_LINKER}
PATHS ${TOOLCHAIN_HOME}
PATH_SUFFIXES bin
NO_DEFAULT_PATH
)
if(CONFIG_IAR_DATA_INIT)
zephyr_linker_section(NAME .iar.init_table KVMA RAM_REGION GROUP RODATA_REGION)
endif()
add_custom_target(${IAR_LINKER})
set(ILINK_THUMB_CALLS_WARNING_SUPPRESSED)
set(IAR_LIB_USED)
function(toolchain_ld_force_undefined_symbols "")
# foreach(symbol ${ARGN})
# zephyr_link_libraries(--place_holder=${symbol})
# endforeach()
endfunction()
# NOTE: ${linker_script_gen} will be produced at build-time; not at configure-time
macro(configure_linker_script linker_script_gen linker_pass_define)
set(extra_dependencies ${ARGN})
set(STEERING_FILE "${CMAKE_CURRENT_BINARY_DIR}/${linker_script_gen}.xcl")
set(STEERING_FILE_ARG "-DSTEERING_FILE=${STEERING_FILE}")
set(cmake_linker_script_settings
${PROJECT_BINARY_DIR}/include/generated/ld_script_settings_${linker_pass_define}.cmake
)
if("${linker_pass_define}" STREQUAL "LINKER_ZEPHYR_PREBUILT")
set(ILINK_THUMB_CALLS_WARNING_SUPPRESSED "--diag_suppress=Lt056")
else()
set(ILINK_THUMB_CALLS_WARNING_SUPPRESSED "")
endif()
if(CONFIG_IAR_LIBC OR CONFIG_IAR_LIBCPP)
set(IAR_LIB_USED "-DIAR_LIBC=1")
else()
set(IAR_LIB_USED "")
endif()
file(GENERATE OUTPUT ${cmake_linker_script_settings} CONTENT
"set(FORMAT \"$<TARGET_PROPERTY:linker,FORMAT>\" CACHE INTERNAL \"\")\n
set(ENTRY \"$<TARGET_PROPERTY:linker,ENTRY>\" CACHE INTERNAL \"\")\n
set(MEMORY_REGIONS \"$<TARGET_PROPERTY:linker,MEMORY_REGIONS>\" CACHE INTERNAL \"\")\n
set(GROUPS \"$<TARGET_PROPERTY:linker,GROUPS>\" CACHE INTERNAL \"\")\n
set(SECTIONS \"$<TARGET_PROPERTY:linker,SECTIONS>\" CACHE INTERNAL \"\")\n
set(SECTION_SETTINGS \"$<TARGET_PROPERTY:linker,SECTION_SETTINGS>\" CACHE INTERNAL \"\")\n
set(SYMBOLS \"$<TARGET_PROPERTY:linker,SYMBOLS>\" CACHE INTERNAL \"\")\n
"
)
add_custom_command(
OUTPUT ${linker_script_gen}
${STEERING_FILE}
DEPENDS
${extra_dependencies}
${DEVICE_API_LD_TARGET}
COMMAND ${CMAKE_COMMAND}
-C ${DEVICE_API_LINKER_SECTIONS_CMAKE}
-C ${cmake_linker_script_settings}
-DPASS="${linker_pass_define}"
${STEERING_FILE_ARG}
-DCONFIG_LINKER_LAST_SECTION_ID=${CONFIG_LINKER_LAST_SECTION_ID}
-DCONFIG_LINKER_LAST_SECTION_ID_PATTERN=${CONFIG_LINKER_LAST_SECTION_ID_PATTERN}
-DCONFIG_IAR_DATA_INIT=${CONFIG_IAR_DATA_INIT}
-DCONFIG_IAR_ZEPHYR_INIT=${CONFIG_IAR_ZEPHYR_INIT}
-DOUT_FILE=${CMAKE_CURRENT_BINARY_DIR}/${linker_script_gen}
${IAR_LIB_USED}
-P ${ZEPHYR_BASE}/cmake/linker/iar/config_file_script.cmake
)
endmacro()
function(toolchain_ld_link_elf)
cmake_parse_arguments(
TOOLCHAIN_LD_LINK_ELF # prefix of output variables
"" # list of names of the boolean arguments
"TARGET_ELF;OUTPUT_MAP;LINKER_SCRIPT" # list of names of scalar arguments
"LIBRARIES_PRE_SCRIPT;LIBRARIES_POST_SCRIPT;DEPENDENCIES" # list of names of list arguments
${ARGN} # input args to parse
)
set(whole_libs)
foreach(lib ${WHOLE_ARCHIVE_LIBS})
list(APPEND whole_libs --whole_archive ${lib})
endforeach()
set(ILINK_SEMIHOSTING)
set(ILINK_BUFFERED_WRITE)
if(${CONFIG_IAR_SEMIHOSTING})
set(ILINK_SEMIHOSTING "--semihosting")
endif()
if(${CONFIG_IAR_BUFFERED_WRITE})
set(ILINK_BUFFERED_WRITE "--redirect __write=__write_buffered")
endif()
set(ILINK_XCL "-f ${TOOLCHAIN_LD_LINK_ELF_LINKER_SCRIPT}.xcl")
set(ILINK_TLS_LIBRARY)
if(${CONFIG_THREAD_LOCAL_STORAGE})
set(ILINK_TLS_LIBRARY "--threaded_lib=manual")
endif()
set(ILINK_TZONE_LIBRARY)
# if(${CONFIG_IAR_LIBC})
# set(ILINK_TZONE_LIBRARY "--timezone_lib")
# endif()
target_link_libraries(
${TOOLCHAIN_LD_LINK_ELF_TARGET_ELF}
${TOOLCHAIN_LD_LINK_ELF_LIBRARIES_PRE_SCRIPT}
--config=${TOOLCHAIN_LD_LINK_ELF_LINKER_SCRIPT}
${TOOLCHAIN_LD_LINK_ELF_LIBRARIES_POST_SCRIPT}
--map=${TOOLCHAIN_LD_LINK_ELF_OUTPUT_MAP}
--log_file=${TOOLCHAIN_LD_LINK_ELF_OUTPUT_MAP}.log
${whole_libs}
${NO_WHOLE_ARCHIVE_LIBS}
$<TARGET_OBJECTS:${OFFSETS_LIB}>
--entry=$<TARGET_PROPERTY:linker,ENTRY>
${ILINK_SEMIHOSTING}
${ILINK_BUFFERED_WRITE}
${ILINK_TLS_LIBRARY}
${ILINK_TZONE_LIBRARY}
${ILINK_THUMB_CALLS_WARNING_SUPPRESSED}
# Do not remove symbols
#--no_remove
${ILINK_XCL}
${TOOLCHAIN_LIBS_OBJECTS}
${TOOLCHAIN_LD_LINK_ELF_DEPENDENCIES}
)
endfunction(toolchain_ld_link_elf)
include(${ZEPHYR_BASE}/cmake/linker/ld/target_relocation.cmake)
include(${ZEPHYR_BASE}/cmake/linker/ld/target_configure.cmake)