arm64ec-pc-windows-msvc

层级:3

Arm64EC(“仿真兼容”)用于 AArch64 Windows 11 上的混合架构(AArch64 和 x86_64)应用程序。请参阅 https://learn.microsoft.com/en-us/windows/arm/arm64ec

目标维护者

需求

构建可以在 AArch64 Windows 11 设备上运行的 Arm64EC 静态和动态库以及可执行文件。Arm64EC 静态库也可以链接到 Arm64X 动态库和可执行文件。

仅支持 LLVM 18 或更高版本的后端

  • 18.1.0 添加了对 Arm64EC 的初始支持。
  • 18.1.2 修复了导入库生成(raw-dylib 支持所需)。
  • 18.1.4 修复了某些在 compiler_builtins 中实现的内联函数的链接问题。

重用来自其他架构的代码 - x86_64 或 AArch64?

Arm64EC 使用 arm64ec 作为其 target_arch,但在大多数情况下可以重用现有的架构特定代码。决定重用哪个架构的最佳思维模型是将 Arm64EC 视为一个 x86_64 进程,它碰巧使用 AArch64 指令集(有一些注意事项)并且具有完全自定义的 ABI。

将此付诸实践

  • Arm64EC 与操作系统、其他进程和其他 DLL 作为 x86_64 进行交互。
    • 例如,backtrace,我们使用 x86_64 版本的 CONTEXTRtlVirtualUnwind
    • 如果您正在配置搜索路径以查找 DLL(例如,将插件或附加组件加载到您的应用程序中),您应该使用与您的应用程序的 x86_64 版本相同的路径,而不是 AArch64 路径(因为 Arm64EC(即 x86_64)进程无法加载本机 AArch64 DLL)。
  • Arm64EC 使用 AArch64 内联函数。
  • 用于 AArch64 的汇编代码可能可以重用于 Arm64EC,但存在许多注意事项。有关完整详细信息,请参阅 Microsoft 关于 Arm64EC ABI 的文档,但简而言之
    • Arm64EC 使用 AArch64 寄存器的子集。
    • Arm64EC 使用与 AArch64 不同的名称修饰方案。
    • Arm64EC 要求为某些函数生成入口和退出 thunk。
    • 间接调用必须通过调用检查器进行。
    • 控制流保护和堆栈检查使用与 AArch64 不同的函数。

构建目标

您可以通过将其添加到 config.toml 中的 target 列表中来构建支持这些目标的 Rust。

[build]
target = [ "arm64ec-pc-windows-msvc" ]

构建 Rust 程序

Rust 尚未为此目标提供预编译的工件。要为此目标编译,您需要启用目标构建 Rust(请参阅上面的“构建目标”),或者使用 build-std 或类似方法构建自己的副本。

测试

可以在 AArch64 Windows 11 设备上运行测试。

交叉编译工具链和 C 代码

可以使用面向 Arm64 的 MSVC 或 Clang 工具链构建 C 代码。

要编译

cl /arm64EC /c ...

要链接

link /MACHINE:ARM64EC ...

进一步阅读:https://learn.microsoft.com/en-us/windows/arm/arm64ec-build