使用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
相关产品推荐
相关产品推荐

