1. Arm Compiler for Embedded 6.17 版本概述Arm Compiler for Embedded 6.17 是 Arm 公司于 2021 年 10 月 21 日发布的嵌入式 C/C 编译工具链版本。作为一款专为裸机软件、固件和实时操作系统RTOS应用开发设计的工具链它提供了对 Arm 架构最新特性的支持。需要特别注意的是6.17 版本已被后续版本取代成为遗留版本。这意味着 Arm 官方不再为其提供更新或安全补丁。对于正在进行长期维护或涉及功能安全如 EN 50128、IEC 61508、IEC 62304 和 ISO 26262 等标准的项目建议考虑使用 Arm Compiler for Embedded FuSa 的长期支持LTS版本。1.1 工具链核心组件6.17 版本包含以下主要组件armclang基于 LLVM 和 Clang 技术的编译器和集成汇编器armar用于收集 ELF 目标文件的归档工具armlink链接器用于组合对象和库以生成可执行文件fromelf镜像转换工具和反汇编器armasm仅支持旧版 Arm 架构的遗留汇编器新项目建议使用 armclang 集成汇编器此外还包含 Arm C 库嵌入式系统运行时支持库和 Arm C 库基于 LLVM libc 项目以及完整的用户文档集。1.2 主要新特性与支持6.17 版本引入了多项重要更新处理器支持新增 Cortex-X2、Cortex-A710 和 Cortex-A510 的支持架构支持提供 Armv9-A 到 Armv9.2-A 的完整支持以及 Armv9.3-A 的 alpha 级汇编支持安全增强针对 Armv8-M VLLDM 指令安全漏洞CVE-2021-35465的缓解措施扩展功能beta 版支持 Armv8.1-M 的 PACBTI-M 扩展链接改进A-profile 和 R-profile 目标的动态链接支持存储管理新增线程本地存储TLS支持2. 安装与集成指南2.1 系统兼容性要求Arm Compiler for Embedded 6.17 支持以下 64 位 x86 平台Linux 主机系统Red Hat Enterprise Linux 7/8Ubuntu Desktop Edition 18.04 LTS/20.04 LTSWindows 主机系统Windows Server 2012/2016/2019Windows 8.1/10重要提示不支持早于上述版本的操作系统平台。使用 Keil MDK 许可证时仅支持 Windows 主机平台。明确不支持 Windows 32 位 x86 主机平台。2.2 安装方式选择根据使用场景不同6.17 版本提供三种安装方式集成到 Arm Development Studio支持 Bronze/Silver/Gold Edition 2021.2 或更高版本支持 Platinum Edition 2021.c 或更高版本必须安装到非 Arm Development Studio 安装目录的其他目录集成到 Keil MDK需要 Keil MDK 5.36 或更高版本推荐安装路径Keil MDK 安装目录下的 ARM\ARMCompiler6.17 子目录例如C:\Keil_v5\ARM\ARMCompiler6.17独立安装可直接作为独立工具链使用需要手动配置环境变量和许可证2.3 许可证管理要点使用浮动许可证时需注意许可证服务器必须运行 armlmd 和 lmgrd 的 11.14.1.0 或更高版本建议始终使用从 Arm 官网下载的最新版许可证服务器软件首次使用前需要正确配置产品密钥和工具链路径3. 架构与处理器支持详解3.1 Armv9 系列架构支持6.17 版本对 Armv9 架构提供了多层次支持架构版本支持级别编译选项示例Armv9.3-AAlpha仅汇编--targetaarch64-arm-none-eabi -marcharmv9.3-aArmv9.2-A完整支持--targetaarch64-arm-none-eabi -marcharmv9.2-aArmv9.1-A完整支持--targetarm-arm-none-eabi -marcharmv9.1-aArmv9-A完整支持--targetaarch64-arm-none-eabi -marcharmv9-a3.2 新增处理器支持配置对于新加入的 Cortex-X2、A710 和 A510 处理器使用时需要特别注意编译选项Cortex-X2# 包含加密扩展 --targetaarch64-arm-none-eabi -mcpucortex-x2crypto # 不包含加密扩展 --targetaarch64-arm-none-eabi -mcpucortex-x2Cortex-A710# AArch64状态含加密扩展 --targetaarch64-arm-none-eabi -mcpucortex-a710crypto # AArch32状态含加密扩展 --targetarm-arm-none-eabi -mcpucortex-a710 -mfpucrypto-neon-fp-armv8Cortex-A510# 含加密扩展 --targetaarch64-arm-none-eabi -mcpucortex-a510crypto # 不含加密扩展 --targetaarch64-arm-none-eabi -mcpucortex-a5103.3 安全漏洞修复实践针对 CVE-2021-35465VLLDM 指令安全漏洞6.17 版本默认启用了以下处理器的缓解措施Cortex-M33Cortex-M35PCortex-M55STAR-MC1对于其他 Armv8-M 和 Armv8.1-M 目标默认禁用缓解措施。如需修改默认行为# 启用缓解措施默认禁用时 -mfix-cmse-cve-2021-35465 # 禁用缓解措施默认启用时 -mno-fix-cmse-cve-2021-354654. 工具链使用进阶技巧4.1 链接时优化(LTO)实践6.17 版本增强了 LTO 支持支持创建和链接包含 LTO 对象的静态库链接器会检测并报告不同编译器版本生成的 LTO 比特码不兼容问题典型错误信息示例L6123E: linking module flags armcompiler-version: IDs have conflicting values in object1 and object2 L6123E: LTO bitcode in object was generated by an incompatible version of armclang4.2 线程本地存储(TLS)实现新增对 AArch64 状态 TLS 的支持关键实现要点支持 bare metal 和 DLL-like 链接模型中的 TLS支持 SysV 链接模型中的 TLS可使用__attribute__((tls-model(model)))指定变量存储模型相关编译选项-ftls-model、-mtls-size、-mtp4.3 分支保护功能配置对于 Armv8.1-M 目标的 PACBTI-M 扩展beta 支持# armclang 分支保护级别设置 -mbranch-protectionprotection # armlink 库安全选项 --library_securityprotection # 汇编支持需要指定 pacbti 特性 -marcharmv8.1-mpacbti5. 常见问题排查手册5.1 编译阶段问题问题1编译优化导致意外行为现象O1 优化级别下函数内联策略改变解决方案使用__attribute__((noinline))或-fno-inline-functions禁用特定函数内联问题2宽字符常量包含多个多字节字符现象报错 wide character literals may not contain multiple characters解决方案检查并修正宽字符常量定义问题3AArch64 O0 优化级别下比较操作错误现象总是评估为 true 的比较操作生成错误代码解决方案升级到修复版本或使用更高优化级别5.2 链接阶段问题问题1链接速度异常缓慢可能原因输入对象中包含标记为 used 的 ELF 节解决方案检查节属性必要时调整链接脚本问题2LTO 对象合并异常现象不同类型的数据节被错误合并解决方案确保所有 LTO 对象使用相同编译器版本生成问题3小对齐节地址计算错误现象对齐小于4字节的节生成错误符号地址解决方案使用--legacyalign选项或确保节对齐≥4字节5.3 库函数相关问题问题1浮点数学函数结果异常影响函数fdim()、fdimf()、fdiml()、scalbln()系列等解决方案确认使用的库版本包含相关修复问题2多线程环境下标准IO死锁现象stdio.h函数在多线程环境中可能死锁解决方案升级到修复版本或实现自定义线程安全IO问题3C库时钟定义错误现象单线程C库中steady_clock和high_resolution_clock定义不正确解决方案使用多线程库版本或实现自定义时钟6. 版本迁移与兼容性建议虽然 6.17 版本提供了诸多新特性但需要注意长期维护项目建议使用 Arm Compiler for Embedded FuSa 的 LTS 版本功能安全项目此版本未通过安全认证不适合安全关键型开发新项目启动考虑使用更新的工具链版本以获得持续支持现有项目升级充分测试新的优化行为验证所有安全缓解措施的兼容性检查所有依赖内联汇编的代码对于从 Arm Compiler 5 迁移的项目建议参考随工具链提供的《迁移与兼容性指南》特别注意汇编语法差异armasm vs armclang 集成汇编器库函数行为变化新的警告和错误检查机制在实际项目中使用 6.17 版本时建议建立完整的版本控制策略记录所有工具链配置和编译选项确保构建的可重复性。对于关键项目应考虑在持续集成系统中固化工具链环境避免意外升级带来的兼容性问题。