1# Copyright (c) 2025 IAR Systems AB 2# 3# SPDX-License-Identifier: Apache-2.0 4 5set_property(TARGET linker PROPERTY devices_start_symbol "_device_list_start") 6find_program(CMAKE_LINKER 7 NAMES ${CROSS_COMPILE}${IAR_LINKER} 8 PATHS ${TOOLCHAIN_HOME} 9 PATH_SUFFIXES bin 10 NO_DEFAULT_PATH 11) 12 13if(CONFIG_IAR_DATA_INIT) 14 zephyr_linker_section(NAME .iar.init_table KVMA RAM_REGION GROUP RODATA_REGION) 15endif() 16 17add_custom_target(${IAR_LINKER}) 18set(ILINK_THUMB_CALLS_WARNING_SUPPRESSED) 19set(IAR_LIB_USED) 20function(toolchain_ld_force_undefined_symbols "") 21# foreach(symbol ${ARGN}) 22# zephyr_link_libraries(--place_holder=${symbol}) 23# endforeach() 24endfunction() 25 26# NOTE: ${linker_script_gen} will be produced at build-time; not at configure-time 27macro(configure_linker_script linker_script_gen linker_pass_define) 28 set(extra_dependencies ${ARGN}) 29 set(STEERING_FILE "${CMAKE_CURRENT_BINARY_DIR}/${linker_script_gen}.xcl") 30 set(STEERING_FILE_ARG "-DSTEERING_FILE=${STEERING_FILE}") 31 set(cmake_linker_script_settings 32 ${PROJECT_BINARY_DIR}/include/generated/ld_script_settings_${linker_pass_define}.cmake 33 ) 34 if("${linker_pass_define}" STREQUAL "LINKER_ZEPHYR_PREBUILT") 35 set(ILINK_THUMB_CALLS_WARNING_SUPPRESSED "--diag_suppress=Lt056") 36 else() 37 set(ILINK_THUMB_CALLS_WARNING_SUPPRESSED "") 38 endif() 39 if(CONFIG_IAR_LIBC OR CONFIG_IAR_LIBCPP) 40 set(IAR_LIB_USED "-DIAR_LIBC=1") 41 else() 42 set(IAR_LIB_USED "") 43 endif() 44 zephyr_linker_generate_linker_settings_file(${cmake_linker_script_settings}) 45 46 add_custom_command( 47 OUTPUT ${linker_script_gen} 48 ${STEERING_FILE} 49 DEPENDS 50 ${extra_dependencies} 51 ${cmake_linker_script_settings} 52 ${DEVICE_API_LD_TARGET} 53 COMMAND ${CMAKE_COMMAND} 54 -C ${cmake_linker_script_settings} 55 -DPASS="${linker_pass_define}" 56 ${STEERING_FILE_ARG} 57 -DOUT_FILE=${CMAKE_CURRENT_BINARY_DIR}/${linker_script_gen} 58 ${IAR_LIB_USED} 59 -P ${ZEPHYR_BASE}/cmake/linker/iar/config_file_script.cmake 60 ) 61 62endmacro() 63 64function(toolchain_ld_link_elf) 65 cmake_parse_arguments( 66 TOOLCHAIN_LD_LINK_ELF # prefix of output variables 67 "" # list of names of the boolean arguments 68 "TARGET_ELF;OUTPUT_MAP;LINKER_SCRIPT" # list of names of scalar arguments 69 "LIBRARIES_PRE_SCRIPT;LIBRARIES_POST_SCRIPT;DEPENDENCIES" # list of names of list arguments 70 ${ARGN} # input args to parse 71 ) 72 73 set(whole_libs) 74 foreach(lib ${WHOLE_ARCHIVE_LIBS}) 75 list(APPEND whole_libs --whole_archive ${lib}) 76 endforeach() 77 78 set(ILINK_SEMIHOSTING) 79 set(ILINK_BUFFERED_WRITE) 80 if(${CONFIG_IAR_SEMIHOSTING}) 81 set(ILINK_SEMIHOSTING "--semihosting") 82 endif() 83 if(${CONFIG_IAR_BUFFERED_WRITE}) 84 set(ILINK_BUFFERED_WRITE "--redirect __write=__write_buffered") 85 endif() 86 87 set(ILINK_XCL "-f ${TOOLCHAIN_LD_LINK_ELF_LINKER_SCRIPT}.xcl") 88 89 set(ILINK_TLS_LIBRARY) 90 if(${CONFIG_THREAD_LOCAL_STORAGE}) 91 set(ILINK_TLS_LIBRARY "--threaded_lib=manual") 92 endif() 93 94 set(ILINK_TZONE_LIBRARY) 95 # if(${CONFIG_IAR_LIBC}) 96 # set(ILINK_TZONE_LIBRARY "--timezone_lib") 97 # endif() 98 99 target_link_libraries( 100 ${TOOLCHAIN_LD_LINK_ELF_TARGET_ELF} 101 ${TOOLCHAIN_LD_LINK_ELF_LIBRARIES_PRE_SCRIPT} 102 --config=${TOOLCHAIN_LD_LINK_ELF_LINKER_SCRIPT} 103 ${TOOLCHAIN_LD_LINK_ELF_LIBRARIES_POST_SCRIPT} 104 --map=${TOOLCHAIN_LD_LINK_ELF_OUTPUT_MAP} 105 --log_file=${TOOLCHAIN_LD_LINK_ELF_OUTPUT_MAP}.log 106 107 ${whole_libs} 108 ${NO_WHOLE_ARCHIVE_LIBS} 109 $<TARGET_OBJECTS:${OFFSETS_LIB}> 110 --entry=$<TARGET_PROPERTY:linker,ENTRY> 111 112 ${ILINK_SEMIHOSTING} 113 ${ILINK_BUFFERED_WRITE} 114 ${ILINK_TLS_LIBRARY} 115 ${ILINK_TZONE_LIBRARY} 116 ${ILINK_THUMB_CALLS_WARNING_SUPPRESSED} 117 # Do not remove symbols 118 #--no_remove 119 ${ILINK_XCL} 120 121 ${TOOLCHAIN_LIBS_OBJECTS} 122 123 ${TOOLCHAIN_LD_LINK_ELF_DEPENDENCIES} 124 ) 125endfunction(toolchain_ld_link_elf) 126 127include(${ZEPHYR_BASE}/cmake/linker/ld/target_relocation.cmake) 128include(${ZEPHYR_BASE}/cmake/linker/ld/target_configure.cmake) 129