This is an automated email from the ASF dual-hosted git repository.
jerpelea pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git
The following commit(s) were added to refs/heads/master by this push:
new 7c38d586750 tools/rust: Fix aarch64 NuttX Rust target specs
7c38d586750 is described below
commit 7c38d586750fdc780105cdf1df06ba59a6607e3e
Author: Shoji Tokunaga <[email protected]>
AuthorDate: Thu May 28 18:05:34 2026 +0900
tools/rust: Fix aarch64 NuttX Rust target specs
Add a custom aarch64 Mach-O Rust target for macOS sim builds and use it
instead of an Apple Darwin Rust target. This keeps Rust cfg values aligned
with NuttX while producing Mach-O objects required by the simulator link.
Also align sim host handling for aarch64 Linux by detecting `aarch64` as
`HOST_ARM64` and avoiding x86-specific `-mcmodel` and `-no-pie` options
on ARM64 hosts.
Signed-off-by: Shoji Tokunaga <[email protected]>
---
CMakeLists.txt | 7 +++---
arch/sim/src/cmake/Toolchain.cmake | 41 ++++++++++++++++++++++++++--------
boards/sim/sim/sim/scripts/Make.defs | 4 ++--
cmake/nuttx_sethost.cmake | 2 +-
tools/Rust.defs | 8 +++++--
tools/aarch64-unknown-nuttx-macho.json | 35 +++++++++++++++++++++++++++++
6 files changed, 79 insertions(+), 18 deletions(-)
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 80fa88636ca..b479ad22296 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -792,10 +792,9 @@ else()
OUTPUT nuttx.rel
COMMAND
${CMAKE_C_COMPILER} ARGS -r $<$<BOOL:${CONFIG_SIM_M32}>:-m32>
- $<$<BOOL:${CONFIG_HOST_LINUX}>:-Wl,-z,noexecstack>
- $<TARGET_OBJECTS:sim_head> $<$<NOT:$<BOOL:${APPLE}>>:-Wl,--start-group>
- ${nuttx_libs_paths} $<$<NOT:$<BOOL:${APPLE}>>:-Wl,--end-group> -o
- nuttx.rel
+ $<$<BOOL:${LINUX}>:-Wl,-z,noexecstack> $<TARGET_OBJECTS:sim_head>
+ $<$<NOT:$<BOOL:${APPLE}>>:-Wl,--start-group> ${nuttx_libs_paths}
+ $<$<NOT:$<BOOL:${APPLE}>>:-Wl,--end-group> -o nuttx.rel
COMMAND ${CMAKE_OBJCOPY} --redefine-syms=nuttx-names.dat nuttx.rel
DEPENDS ${nuttx_libs} sim_head sim_redefine_symbols
COMMAND_EXPAND_LISTS)
diff --git a/arch/sim/src/cmake/Toolchain.cmake
b/arch/sim/src/cmake/Toolchain.cmake
index e326dca663e..dcec62d66bd 100644
--- a/arch/sim/src/cmake/Toolchain.cmake
+++ b/arch/sim/src/cmake/Toolchain.cmake
@@ -20,8 +20,24 @@
#
#
##############################################################################
+if(CMAKE_HOST_SYSTEM_NAME STREQUAL "Linux")
+ set(SIM_HOST_LINUX true)
+elseif(CMAKE_HOST_SYSTEM_NAME STREQUAL "Darwin")
+ set(SIM_HOST_MACOS true)
+endif()
+
+if(CMAKE_HOST_SYSTEM_PROCESSOR MATCHES "^(x86_64|amd64|AMD64)$")
+ set(SIM_HOST_X86_64 true)
+elseif(CMAKE_HOST_SYSTEM_PROCESSOR MATCHES "^(i[3-6]86|x86)$")
+ set(SIM_HOST_X86_32 true)
+elseif(CMAKE_HOST_SYSTEM_PROCESSOR MATCHES "^(aarch64|arm64)$")
+ set(SIM_HOST_ARM64 true)
+elseif(CMAKE_HOST_SYSTEM_PROCESSOR MATCHES "^(arm|armv[0-9].*)$")
+ set(SIM_HOST_ARM true)
+endif()
+
if(APPLE AND CONFIG_SIM_TOOLCHAIN_GCC)
- if(CONFIG_HOST_ARM64)
+ if(SIM_HOST_ARM64)
find_program(CMAKE_C_ELF_COMPILER aarch64-elf-gcc)
find_program(CMAKE_CXX_ELF_COMPILER aarch64-elf-g++)
else()
@@ -41,14 +57,14 @@ if(WIN32)
return()
endif()
-if(CONFIG_HOST_LINUX)
+if(SIM_HOST_LINUX)
set(CMAKE_LD ld)
set(CMAKE_PREPROCESSOR cc -E -P -x c)
set(CMAKE_STRIP strip --strip-unneeded)
endif()
# LLVM style architecture flags
-if(CONFIG_HOST_X86_64)
+if(SIM_HOST_X86_64)
if(CONFIG_SIM_M32)
set(LLVM_ARCHTYPE "x86")
set(LLVM_CPUTYPE "i686")
@@ -56,18 +72,18 @@ if(CONFIG_HOST_X86_64)
set(LLVM_ARCHTYPE "x86_64")
set(LLVM_CPUTYPE "skylake")
endif()
-elseif(CONFIG_HOST_X86_32)
+elseif(SIM_HOST_X86_32)
set(LLVM_ARCHTYPE "x86")
set(LLVM_CPUTYPE "i686")
-elseif(CONFIG_HOST_ARM64)
+elseif(SIM_HOST_ARM64)
set(LLVM_ARCHTYPE "aarch64")
set(LLVM_CPUTYPE "cortex-a53")
-elseif(CONFIG_HOST_ARM)
+elseif(SIM_HOST_ARM)
set(LLVM_ARCHTYPE "arm")
set(LLVM_CPUTYPE "cortex-a9")
endif()
-if(CONFIG_HOST_LINUX OR CONFIG_HOST_MACOS)
+if(SIM_HOST_LINUX OR SIM_HOST_MACOS)
set(LLVM_ABITYPE "sysv")
elseif(WIN32)
set(LLVM_ABITYPE "msvc")
@@ -230,7 +246,14 @@ endif()
if(CONFIG_SIM_M32)
add_compile_options(-m32)
add_link_options(-m32)
-elseif(NOT APPLE)
+elseif(NOT APPLE AND NOT SIM_HOST_ARM64)
+ # To compile 64-bit Sim, adding no-pie is necessary to prevent linking errors
+ # but this may cause other issues on Ubuntu 20.
+ #
+ # NOTE: HOST_ARM64 is also excluded -- Ubuntu/Debian arm64 toolchains ship
+ # only libgcc_s.so.1 (no libgcc_s.a), and -no-pie forces gcc to look for the
+ # static archive; skipping it lets gcc use the default PIE link path which
+ # works correctly on aarch64 hosts.
add_compile_options(-no-pie)
add_link_options(-Wl,-no-pie)
endif()
@@ -254,6 +277,6 @@ else()
add_link_options(-Wl,-Ttext-segment=0x40000000)
endif()
-if(CONFIG_HOST_LINUX)
+if(SIM_HOST_LINUX)
add_link_options(-Wl,-z,noexecstack)
endif()
diff --git a/boards/sim/sim/sim/scripts/Make.defs
b/boards/sim/sim/sim/scripts/Make.defs
index 009c76b1622..2cc3d159d27 100644
--- a/boards/sim/sim/sim/scripts/Make.defs
+++ b/boards/sim/sim/sim/scripts/Make.defs
@@ -151,7 +151,7 @@ ifeq ($(CONFIG_SIM_M32),y)
else
ARCHCFLAGS += -fno-pic
ARCHCXXFLAGS += -fno-pic
- ifneq ($(CONFIG_HOST_MACOS),y)
+ ifeq ($(CONFIG_HOST_X86_64),y)
ARCHCFLAGS += -mcmodel=medium
ARCHCXXFLAGS += -mcmodel=medium
endif
@@ -167,7 +167,7 @@ ifeq ($(CONFIG_HOST_X86_64),y)
LLVM_ARCHTYPE := x86_64
LLVM_CPUTYPE := skylake
endif
-else ifeq ($(CONFIG_HOST_X86_32),y)
+else ifeq ($(CONFIG_HOST_X86),y)
LLVM_ARCHTYPE := x86
LLVM_CPUTYPE := i686
else ifeq ($(CONFIG_HOST_ARM64),y)
diff --git a/cmake/nuttx_sethost.cmake b/cmake/nuttx_sethost.cmake
index f26399b587b..603be508a5a 100644
--- a/cmake/nuttx_sethost.cmake
+++ b/cmake/nuttx_sethost.cmake
@@ -110,7 +110,7 @@ function(nuttx_sethost)
elseif(ARCHITECTURE STREQUAL "arm")
message(" Select HOST_ARM=y")
list(APPEND NUTTX_SYSTEM_SETHOST "HOST_ARM=y")
- elseif(ARCHITECTURE STREQUAL "arm64")
+ elseif(ARCHITECTURE MATCHES "^(arm64|aarch64)$")
message(" Select HOST_ARM64=y")
list(APPEND NUTTX_SYSTEM_SETHOST "HOST_ARM64=y")
endif()
diff --git a/tools/Rust.defs b/tools/Rust.defs
index 42ccffb37c1..50225761e63 100644
--- a/tools/Rust.defs
+++ b/tools/Rust.defs
@@ -41,10 +41,14 @@ ifeq ($(CONFIG_ARCH_SIM),y)
RUSTFLAGS += --target i686-unknown-linux-gnu
else
# For other archs, such as aarch64, arm etc
- RUSTFLAGS += --target $(LLVM_ARCHTYPE)-unknown-linux-gnu
+ RUSTFLAGS += --target $(LLVM_ARCHTYPE)-unknown-linux-gnu
endif
else ifeq ($(CONFIG_HOST_MACOS),y)
- RUSTFLAGS += --target $(LLVM_ARCHTYPE)-apple-darwin
+ ifeq ($(LLVM_ARCHTYPE),aarch64)
+ RUSTFLAGS += --target $(TOPDIR)/tools/aarch64-unknown-nuttx-macho.json
+ else
+ $(error Unsupported Rust SIM target on macOS:
LLVM_ARCHTYPE=$(LLVM_ARCHTYPE))
+ endif
endif
else ifeq ($(CONFIG_ARCH_RISCV),y)
# Target triple is riscv[32|64][isa]-unknown-none-elf
diff --git a/tools/aarch64-unknown-nuttx-macho.json
b/tools/aarch64-unknown-nuttx-macho.json
new file mode 100644
index 00000000000..5410ffd9f21
--- /dev/null
+++ b/tools/aarch64-unknown-nuttx-macho.json
@@ -0,0 +1,35 @@
+{
+ "arch": "aarch64",
+ "archive-format": "darwin",
+ "binary-format": "mach-o",
+ "crt-objects-fallback": "false",
+ "data-layout":
"e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-n32:64-S128-Fn32",
+ "debuginfo-kind": "dwarf",
+ "default-uwtable": true,
+ "disable-redzone": true,
+ "emit-debug-gdb-scripts": false,
+ "features": "+v8a,+strict-align,+neon",
+ "frame-pointer": "non-leaf",
+ "function-sections": false,
+ "linker-flavor": "gnu-lld",
+ "lld-flavor": "darwin",
+ "llvm-target": "arm64-apple-macosx",
+ "max-atomic-width": 128,
+ "metadata": {
+ "description": "aarch64 Mach-O target for NuttX sim on macOS",
+ "host_tools": false,
+ "std": true,
+ "tier": 3
+ },
+ "os": "nuttx",
+ "panic-strategy": "abort",
+ "split-debuginfo": "off",
+ "stack-probes": {
+ "kind": "inline"
+ },
+ "target-family": [
+ "unix"
+ ],
+ "target-pointer-width": 64,
+ "vendor": "unknown"
+}