1 Clang 实现注意事项

本文档提供了 Clang/LLVM 实现 eBPF 指令集的更多详细信息。

1.1 版本

Clang 定义了“CPU”版本,其中 CPU 版本 3 对应当前的 eBPF ISA。

例如,Clang 可以使用 -mcpu=v3 来选择 eBPF ISA 版本 3。

1.2 算术指令

对于版本 3 之前的 CPU 版本,Clang v7.0 及更高版本可以使用 -Xclang -target-feature -Xclang +alu32 启用 BPF_ALU 支持。在 CPU 版本 3 中,支持是自动包含的。

1.3 跳转指令

如果使用 -O0,Clang 将生成 BPF_CALL | BPF_X | BPF_JMP (0x8d) 指令,Linux 内核验证器不支持该指令。

1.4 原子操作

-mcpu=v3 启用时,Clang 默认可以生成原子指令。如果 -mcpu 设置为较低版本,Clang 唯一能生成的原子指令是 不带 BPF_FETCHBPF_ADD。如果需要在保持较低 -mcpu 版本的同时启用原子特性,可以使用 -Xclang -target-feature -Xclang +alu32