mirror of
https://github.com/espressif/esp-idf.git
synced 2026-10-02 03:00:34 +03:00
fix(esp_system): enable linking with LLD on RISC-V targets
This commit is contained in:
@@ -1053,8 +1053,42 @@ macro(project project_name)
|
||||
target_link_options(${project_elf} PRIVATE "-Wl,--defsym=IDF_TARGET_${idf_target}=0")
|
||||
# Enable map file output
|
||||
target_link_options(${project_elf} PRIVATE "-Wl,--Map=${mapfile}")
|
||||
if(CONFIG_COMPILER_USE_LLD)
|
||||
if(CMAKE_C_COMPILER_ID MATCHES "Clang")
|
||||
# The last --ld-path on the link line takes precedence over the
|
||||
# one set in the toolchain file, selecting LLD for the link.
|
||||
# The bare name is looked up in PATH.
|
||||
target_link_options(${project_elf} PRIVATE "--ld-path=ld.lld")
|
||||
else()
|
||||
# GCC has no --ld-path; -fuse-ld=lld makes the driver search
|
||||
# its search paths and PATH for a binary named "ld.lld".
|
||||
target_link_options(${project_elf} PRIVATE "-fuse-ld=lld")
|
||||
endif()
|
||||
# Bare-metal images have no dynamic loader, so PT_GNU_RELRO is
|
||||
# meaningless. LLD enables relro by default and errors out when
|
||||
# relro sections (e.g. TLS .flash.tdata) are not contiguous in the
|
||||
# IDF linker scripts, so disable it.
|
||||
target_link_options(${project_elf} PRIVATE "-Wl,-z,norelro")
|
||||
# Some targets (e.g. esp32s3) use NOLOAD dummy sections that
|
||||
# deliberately overlap other sections' address ranges, because two
|
||||
# memory regions alias the same bus address space. GNU ld skips
|
||||
# NOBITS sections in its overlap check; LLD does not, so disable
|
||||
# the check there.
|
||||
target_link_options(${project_elf} PRIVATE "-Wl,--no-check-sections")
|
||||
set(linker_binary "ld.lld")
|
||||
else()
|
||||
set(linker_binary "${CMAKE_LINKER}")
|
||||
endif()
|
||||
# Report which linker the link will use, with its version banner
|
||||
execute_process(COMMAND ${linker_binary} "--version"
|
||||
OUTPUT_VARIABLE linker_version
|
||||
ERROR_QUIET
|
||||
OUTPUT_STRIP_TRAILING_WHITESPACE)
|
||||
string(REGEX REPLACE "\n.*" "" linker_version "${linker_version}")
|
||||
message(STATUS "Linker: ${linker_binary} (${linker_version})")
|
||||
unset(linker_version)
|
||||
# Check if linker supports --no-warn-rwx-segments
|
||||
execute_process(COMMAND ${CMAKE_LINKER} "--no-warn-rwx-segments" "--version"
|
||||
execute_process(COMMAND ${linker_binary} "--no-warn-rwx-segments" "--version"
|
||||
RESULT_VARIABLE result
|
||||
OUTPUT_QUIET
|
||||
ERROR_QUIET)
|
||||
@@ -1069,6 +1103,7 @@ macro(project project_name)
|
||||
# Throw error if orphan sections are found
|
||||
target_link_options(${project_elf} PRIVATE "-Wl,--orphan-handling=error")
|
||||
endif()
|
||||
unset(linker_binary)
|
||||
unset(idf_target)
|
||||
endif()
|
||||
|
||||
|
||||
@@ -225,7 +225,10 @@ function(preprocess_linker_file cmake_target script_in output_var preserve_suffi
|
||||
if(script_parent_name STREQUAL idf_target)
|
||||
# Add "../.." directory to include path (e.g. for esp_system component)
|
||||
get_filename_component(dir_to_include "${script_parent_dir}" DIRECTORY)
|
||||
set(extra_cflags "-I\"${dir_to_include}\"")
|
||||
# Add esp_system/ld directory to include path for the shared linker
|
||||
# script fragments (e.g. ld.elf.internal.sections)
|
||||
idf_component_get_property(esp_system_dir esp_system COMPONENT_DIR)
|
||||
set(extra_cflags "-I\"${dir_to_include}\" -I\"${esp_system_dir}/ld\"")
|
||||
endif()
|
||||
|
||||
# Keep comments (-C): historical behavior for cmakev1 linker scripts. It was
|
||||
|
||||
Reference in New Issue
Block a user