From 321e395a8f4e79ea74b305c248c2f5aec96a4202 Mon Sep 17 00:00:00 2001 From: Ederson de Souza Date: Thu, 21 Mar 2024 15:50:13 -0700 Subject: [PATCH] linker: Include libkernel.a in the whole-archive when llext is enabled Differently from other libraries, which are included whole in the final Zephyr ELF, libkernel.a itself isn't. Assuming this is intended to enable optimisations (if it isn't, this patch will break things) - linker can remove parts of the kernel that are not used by the application. However, when considering Linkable Loadable Extensions (llext), this optimisations can be counterproductive: for instance, syscalls that are not used by the application won't be available for extensions. It won't matter if someone "EXPORT_SYMBOL" for them, or even try to keep them using LINKER_KEEP, they'll be gone. To avoid that, this patches includes, when CONFIG_LLEXT=y, libkernel.a inside the linker "whole-archive" block. This ends up making it consider libkernel.a as a library whose all symbols should be kept. Note this doesn't mean that all symbols will be there - things compiled out via Kconfig will naturally still be out. Signed-off-by: Ederson de Souza --- CMakeLists.txt | 7 +++++++ cmake/linker/arcmwdt/target.cmake | 4 ++-- cmake/linker/ld/target.cmake | 4 ++-- cmake/linker/lld/target.cmake | 4 ++-- cmake/linker/xt-ld/target.cmake | 4 ++-- kernel/CMakeLists.txt | 2 +- 6 files changed, 16 insertions(+), 9 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 6c44e41c810..d8f2801d011 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -876,6 +876,13 @@ foreach(zephyr_lib ${ZEPHYR_LIBS_PROPERTY}) add_dependencies(${zephyr_lib} zephyr_generated_headers) endforeach() +if(CONFIG_LLEXT) + set(WHOLE_ARCHIVE_LIBS ${ZEPHYR_LIBS_PROPERTY} kernel) +else() + set(WHOLE_ARCHIVE_LIBS ${ZEPHYR_LIBS_PROPERTY}) + set(NO_WHOLE_ARCHIVE_LIBS kernel) +endif() + get_property(OUTPUT_FORMAT GLOBAL PROPERTY PROPERTY_OUTPUT_FORMAT) if (CONFIG_CODE_DATA_RELOCATION) diff --git a/cmake/linker/arcmwdt/target.cmake b/cmake/linker/arcmwdt/target.cmake index 067c2dc286e..f2247ba4540 100644 --- a/cmake/linker/arcmwdt/target.cmake +++ b/cmake/linker/arcmwdt/target.cmake @@ -97,9 +97,9 @@ function(toolchain_ld_link_elf) ${LINKERFLAGPREFIX}--entry=__start ${LINKERFLAGPREFIX}--Map=${TOOLCHAIN_LD_LINK_ELF_OUTPUT_MAP} ${LINKERFLAGPREFIX}--whole-archive - ${ZEPHYR_LIBS_PROPERTY} + ${WHOLE_ARCHIVE_LIBS} ${LINKERFLAGPREFIX}--no-whole-archive - kernel + ${NO_WHOLE_ARCHIVE_LIBS} $ ${LIB_INCLUDE_DIR} -L${PROJECT_BINARY_DIR} diff --git a/cmake/linker/ld/target.cmake b/cmake/linker/ld/target.cmake index b57f8902044..2d60e8ea63d 100644 --- a/cmake/linker/ld/target.cmake +++ b/cmake/linker/ld/target.cmake @@ -134,9 +134,9 @@ function(toolchain_ld_link_elf) ${LINKERFLAGPREFIX},-Map=${TOOLCHAIN_LD_LINK_ELF_OUTPUT_MAP} ${LINKERFLAGPREFIX},--whole-archive - ${ZEPHYR_LIBS_PROPERTY} + ${WHOLE_ARCHIVE_LIBS} ${LINKERFLAGPREFIX},--no-whole-archive - kernel + ${NO_WHOLE_ARCHIVE_LIBS} $ ${LIB_INCLUDE_DIR} -L${PROJECT_BINARY_DIR} diff --git a/cmake/linker/lld/target.cmake b/cmake/linker/lld/target.cmake index f71a217e5be..5deab047100 100644 --- a/cmake/linker/lld/target.cmake +++ b/cmake/linker/lld/target.cmake @@ -94,9 +94,9 @@ function(toolchain_ld_link_elf) ${LINKERFLAGPREFIX},-Map=${TOOLCHAIN_LD_LINK_ELF_OUTPUT_MAP} ${LINKERFLAGPREFIX},--whole-archive - ${ZEPHYR_LIBS_PROPERTY} + ${WHOLE_ARCHIVE_LIBS} ${LINKERFLAGPREFIX},--no-whole-archive - kernel + ${NO_WHOLE_ARCHIVE_LIBS} $ ${LIB_INCLUDE_DIR} -L${PROJECT_BINARY_DIR} diff --git a/cmake/linker/xt-ld/target.cmake b/cmake/linker/xt-ld/target.cmake index 426bced0a61..20209107ff7 100644 --- a/cmake/linker/xt-ld/target.cmake +++ b/cmake/linker/xt-ld/target.cmake @@ -126,9 +126,9 @@ function(toolchain_ld_link_elf) ${LINKERFLAGPREFIX},-Map=${TOOLCHAIN_LD_LINK_ELF_OUTPUT_MAP} ${LINKERFLAGPREFIX},--whole-archive - ${ZEPHYR_LIBS_PROPERTY} + ${WHOLE_ARCHIVE_LIBS} ${LINKERFLAGPREFIX},--no-whole-archive - kernel + ${NO_WHOLE_ARCHIVE_LIBS} $ ${LIB_INCLUDE_DIR} -L${PROJECT_BINARY_DIR} diff --git a/kernel/CMakeLists.txt b/kernel/CMakeLists.txt index 6d40e13d09d..1883b45a138 100644 --- a/kernel/CMakeLists.txt +++ b/kernel/CMakeLists.txt @@ -1,7 +1,7 @@ # SPDX-License-Identifier: Apache-2.0 # kernel is a normal CMake library and not a zephyr_library because it -# should not be --whole-archive'd +# should usually not be --whole-archive'd zephyr_syscall_header( ${ZEPHYR_BASE}/include/zephyr/device.h