You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 09:55:07