a17fe86de2
LLVM LLD fills empty spaces (created using ALIGN() or moving the location counter) in executable segments with TrapInstr pattern, e.g. for ARM the TrapInstr pattern is 0xd4d4d4d4. GNU LD fills empty spaces with 0x00 pattern. We may want to have some section (e.g. rom_start) filled with 0x00, e.g. because MCU can interpret the pattern as a configuration data. Signed-off-by: Patryk Duda <pdk@semihalf.com>
86 lines
2.8 KiB
CMake
86 lines
2.8 KiB
CMake
# SPDX-License-Identifier: Apache-2.0
|
|
|
|
zephyr_library()
|
|
|
|
# Library may be empty due to kconfigs
|
|
zephyr_library_property(ALLOW_EMPTY TRUE)
|
|
|
|
zephyr_library_sources_ifdef(
|
|
CONFIG_GEN_ISR_TABLES
|
|
sw_isr_common.c
|
|
)
|
|
|
|
if(NOT CONFIG_ARCH_HAS_TIMING_FUNCTIONS AND
|
|
NOT CONFIG_SOC_HAS_TIMING_FUNCTIONS AND
|
|
NOT CONFIG_BOARD_HAS_TIMING_FUNCTIONS)
|
|
zephyr_library_sources_ifdef(CONFIG_TIMING_FUNCTIONS timing.c)
|
|
endif()
|
|
|
|
# Put functions and data in their own binary sections so that ld can
|
|
# garbage collect them
|
|
zephyr_cc_option(-ffunction-sections -fdata-sections)
|
|
|
|
zephyr_linker_sources_ifdef(CONFIG_GEN_ISR_TABLES
|
|
SECTIONS
|
|
${ZEPHYR_BASE}/include/zephyr/linker/intlist.ld
|
|
)
|
|
|
|
zephyr_linker_sources_ifdef(CONFIG_GEN_IRQ_VECTOR_TABLE
|
|
ROM_START
|
|
SORT_KEY 0x0vectors
|
|
${ZEPHYR_BASE}/include/zephyr/linker/irq-vector-table-section.ld
|
|
)
|
|
|
|
if(CONFIG_GEN_ISR_TABLES)
|
|
zephyr_linker_section(NAME .intList VMA IDT_LIST LMA IDT_LIST NOINPUT PASS NOT LINKER_ZEPHYR_FINAL)
|
|
zephyr_linker_section_configure(SECTION .intList KEEP INPUT ".irq_info" FIRST)
|
|
zephyr_linker_section_configure(SECTION .intList KEEP INPUT ".intList")
|
|
|
|
zephyr_linker_section_configure(SECTION /DISCARD/ KEEP INPUT ".irq_info" PASS LINKER_ZEPHYR_FINAL)
|
|
zephyr_linker_section_configure(SECTION /DISCARD/ KEEP INPUT ".intList" PASS LINKER_ZEPHYR_FINAL)
|
|
endif()
|
|
|
|
zephyr_linker_sources_ifdef(CONFIG_ARCH_HAS_RAMFUNC_SUPPORT
|
|
RAM_SECTIONS
|
|
ramfunc.ld
|
|
)
|
|
|
|
zephyr_linker_sources_ifdef(CONFIG_NOCACHE_MEMORY
|
|
RAM_SECTIONS
|
|
nocache.ld
|
|
)
|
|
|
|
# Only ARM, X86 and OPENISA_RV32M1_RISCV32 use ROM_START_OFFSET.
|
|
if (DEFINED CONFIG_ARM OR DEFINED CONFIG_X86 OR DEFINED CONFIG_ARM64
|
|
OR DEFINED CONFIG_SOC_OPENISA_RV32M1_RISCV32)
|
|
# Exclamation mark is printable character with lowest number in ASCII table.
|
|
# We are sure that this file will be included as a first.
|
|
zephyr_linker_sources(ROM_START SORT_KEY ! rom_start_address.ld)
|
|
# Some linkers fill unspecified region with pattern other than 0x00. Include
|
|
# fill_with_zeros.ld file which forces the linker to use 0x00 pattern. Please
|
|
# note that the pattern will affect empty spaces created after FILL(0x00).
|
|
zephyr_linker_sources(ROM_START SORT_KEY $ fill_with_zeros.ld)
|
|
zephyr_linker_sources(ROM_START SORT_KEY 0x0 rom_start_offset.ld)
|
|
# Handled in ld.cmake
|
|
endif()
|
|
|
|
|
|
# isr_tables is a normal CMake library and not a zephyr_library because it
|
|
# should not be --whole-archive'd
|
|
if (CONFIG_GEN_ISR_TABLES)
|
|
add_library(isr_tables
|
|
isr_tables.c
|
|
)
|
|
|
|
add_dependencies(isr_tables zephyr_generated_headers)
|
|
target_link_libraries(isr_tables zephyr_interface)
|
|
zephyr_library_link_libraries(isr_tables)
|
|
endif()
|
|
|
|
if(CONFIG_COVERAGE)
|
|
zephyr_compile_options($<TARGET_PROPERTY:compiler,coverage>)
|
|
zephyr_link_libraries_ifndef(CONFIG_NATIVE_LIBRARY $<TARGET_PROPERTY:linker,coverage>)
|
|
endif()
|
|
|
|
zephyr_library_sources_ifdef(CONFIG_SEMIHOST semihost.c)
|