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

使用FDO编译aarch64内核时出现‘asm’约束不可行错误求助

问题原因

gcc 8.x系列在aarch64架构下,结合-fprofile-use进行反馈导向优化(FDO)时,对asm goto内联汇编的约束处理存在bug。内核中的asm_volatile_goto宏额外添加了asm ("")语句,在FDO第二阶段编译时,编译器会基于gcda的profile信息尝试更激进的寄存器分配和优化策略,这会和aarch64架构下内联汇编的约束产生冲突,最终触发"impossible constraint in 'asm'"错误。而x86架构的gcc 8.x对该场景的约束处理逻辑不同,因此不会出现问题。

规避方法

方法1:针对冲突函数禁用FDO instrumentation

找到hchacha_block_arch函数的定义位置(通常在arch/arm64/crypto/chacha-neon.S或关联头文件中),在函数声明/定义前添加__attribute__((no_profile_instrument_function))属性,禁止编译器对该函数进行profile相关的优化:

__attribute__((no_profile_instrument_function))
void hchacha_block_arch(...) {
    // 原函数内容
}

如果该函数是通过宏定义的内联汇编,也可以给宏包裹的代码添加上这个属性。

方法2:修改asm_volatile_goto宏适配gcc8+aarch64

在include/linux/compiler-gcc.h中,针对aarch64架构和gcc8版本修改宏定义,移除可能触发冲突的asm ("")语句:

// 找到原asm_volatile_goto宏定义,替换为以下内容
#if defined(__aarch64__) && (__GNUC__ == 8)
#define asm_volatile_goto(x...) do { asm goto(x); } while (0)
#else
#define asm_volatile_goto(x...) do { asm goto(x); asm (""); } while (0)
#endif

这个修改仅针对问题场景生效,不会影响其他架构或gcc版本的编译逻辑。

方法3:升级gcc版本

gcc 9.x及以后的版本已经修复了aarch64架构下asm goto与-fprofile-use的兼容性问题,升级到gcc 9或更高版本可以彻底解决该错误,无需修改内核代码。

内容的提问来源于stack exchange,提问作者Saltaf

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 04:30:46