Clang编译选项-mbranch-protection=pac-ret+bti未生成BTI指令问题咨询
Clang 12.0中
-mbranch-protection=pac-ret+bti未生成BTI指令的异常问题 问题现象
使用Clang 12.0编译arm64e架构代码时,指定-mbranch-protection=pac-ret+bti选项,按文档说明应同时生成PAC(paciasp)和BTI指令,但实际仅生成paciasp,无BTI指令;单独使用-mbranch-protection=bti时,函数开头能正常生成bti c指令。
PAC用于防御ROP攻击,BTI用于防御JOP攻击,此行为不符合预期,怀疑是编译器实现层面的Bug。
环境说明
- 指令集支持:BTI要求armv8.5-a及以上版本,PAC要求armv8.3-a及以上版本,测试时已指定
-march=armv8.7-a - 编译器版本:Clang 12.0
测试代码(test.c)
#include<stdio.h> int main(int argc, char** argv){ printf("%s", "Hello Main!"); }
编译命令与输出
1. PAC+BTI组合编译
clang -S -mbranch-protection=pac-ret+bti -arch arm64e -march=armv8.7-a -o test.s test.c
生成的汇编关键片段:
main: paciasp ----- ----- ----- retaa
注:未生成BTI指令
2. 仅BTI编译
clang -S -mbranch-protection=bti -arch arm64e -march=armv8.7-a -o test.s test.c
生成的汇编关键片段:
main: bti c ----- ----- -----
分析与解决建议
这是Clang 12.0版本的已知实现缺陷,早期版本中同时指定pac-ret和bti时,编译器的指令生成逻辑存在冲突,导致BTI指令被忽略。
- 优先建议升级到Clang 13及以上版本,后续版本已修复该问题;
- 临时 workaround:可以为目标函数添加
__attribute__((target("bti")))属性,强制编译器生成BTI指令。
内容的提问来源于stack exchange,提问作者Baber
相关产品推荐
相关产品推荐

