Arm64架构SHA512 Intrinsics用GCC编译失败问题求助
Arm64下GCC编译SHA512/SHA256 Intrinsics报错的解决方案
问题背景
基于Arm64(aarch64)架构的SHA512 Intrinsics代码(示例如下),在MacBook M1的Ubuntu 22.10虚拟机中使用GCC 12.2.0编译时,触发inlining failed in call to 'always_inline'和target specific option mismatch错误,但Clang 15.0.6可正常编译通过。
示例代码test-sha512.c:
#include <arm_neon.h> const uint64_t data[256] = {0,}; void test() { uint64x2_t a = vld1q_u64(data); a = vsha512h2q_u64(a, a, a); }
GCC编译报错输出:
$ gcc -c test-sha512.c -march=armv8-a+sha3 In file included from test-sha512.c:1: /usr/lib/gcc/aarch64-linux-gnu/12/include/arm_neon.h: In function ‘test’: /usr/lib/gcc/aarch64-linux-gnu/12/include/arm_neon.h:29671:1: error: inlining failed in call to ‘always_inline’ ‘vsha512h2q_u64’: target specific option mismatch 29671 | vsha512h2q_u64 (uint64x2_t __a, uint64x2_t __b, uint64x2_t __c) | ^~~~~~~~~~~~~~ test-sha512.c:7:9: note: called from here 7 | a = vsha512h2q_u64(a, a, a); | ^~~~~~~~~~~~~~~~~~~~~~~
问题原因
GCC与Clang对Arm加密扩展的启用逻辑存在差异:
- Arm架构中SHA256、SHA512属于SHA2套件,但GCC 12.x中,SHA256 Intrinsics需要同时启用
sha2和crypto扩展才能被识别; - SHA512 Intrinsics的支持在GCC 12.x中存在bug,即使指定
+sha3或+sha2选项,编译器仍无法正确识别对应的指令集特性,导致内联函数匹配失败。
解决方案
1. SHA256 Intrinsics编译修复
使用以下编译命令,同时指定sha2和crypto扩展:
gcc -c test-sha256.c -march=armv8-a+sha2+crypto
2. SHA512 Intrinsics编译修复
有三种可行方案:
- 方案一:升级GCC版本:GCC 13及以后版本已修复该SHA512 Intrinsics的兼容性问题,升级后可直接使用
-march=armv8-a+sha3编译; - 方案二:使用隐藏编译选项:在GCC 12.x中,添加未在官方帮助文档中列出的
-msha512选项强制启用SHA512指令集支持,编译命令如下:gcc -c test-sha512.c -march=armv8-a+sha3 -msha512 - 方案三:切换到Clang编译:如测试所示,Clang 15.0.6可正常识别
-march=armv8-a+sha3并编译SHA512 Intrinsics代码。
已知问题确认
该问题是GCC 12.x针对Arm64平台SHA512 Intrinsics的已知bug,官方已在后续版本中完成修复。
内容的提问来源于stack exchange,提问作者Thierry Lelegard
相关产品推荐
相关产品推荐

