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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 21:58:19