013.实战:将 eBPF程序attach到hook点并运行
结论先给你一句话:
autoattach** 的意义是:
****让 bpftool 在“能确定 attach 目标”的情况下,
****帮你把 eBPF 程序“自动挂上去”,
**从而把验证(load)和运行(attach)合并成一步。
但它不是万能,而且用对/用错,意义完全不同。下面我把它讲到“不会误用”的程度。
一、这条命令到底多做了什么?
sudo bpftool prog load u_ebpf/mem.bpf.o /sys/fs/bpf/test autoattach
对比一下你前两步
① 没有 autoattach
bpftool prog load mem.bpf.o /sys/fs/bpf/test
做了什么:
- ✔ verifier 校验
- ✔ 程序进入内核
- ❌ 没有运行
- ❌ 没有 hook 到任何事件
② 加上 autoattach
bpftool prog load mem.bpf.o /sys/fs/bpf/test autoattach
多做了一件事:
**bpftool 会根据 ELF 里
SEC("...")的 section 名字,
****自动推断“这个程序该 attach 到哪里”,
**并立即帮你 attach。
二、autoattach 是如何“自动”的?(核心机制)
它完全依赖 section name
bpftool 内部有一套硬编码映射规则,例如:
| section | autoattach 行为 |
|---|---|
tracepoint/syscalls/sys_enter_execve |
attach 到对应 tracepoint |
raw_tracepoint/sched_switch |
attach 到 raw tracepoint |
xdp |
attach 到指定网卡(⚠️有限) |
cgroup_skb/ingress |
attach 到 cgroup |
fentry/do_exit |
attach 到内核函数 |
fexit/do_exit |
attach 到内核函数 |
👉 这些是“attach 目标可以 100% 确定的场景”
三、什么时候 autoattach 非常有意义?
✅ 1️⃣ tracepoint / raw_tracepoint
SEC("tracepoint/syscalls/sys_enter_openat")
int tp_openat(...) { ... }
bpftool prog load tp.bpf.o /sys/fs/bpf/tp autoattach
✔ 自动 attach
✔ 程序立刻运行
✔ 非常适合验证逻辑
✅ 2️⃣ fentry / fexit(现代内核)
SEC("fentry/do_exit")
int BPF_PROG(do_exit, long code) { ... }
bpftool prog load fentry.bpf.o /sys/fs/bpf/f autoattach
✔ attach 成功
✔ 不需要你知道 pid / fd / path
✅ 3️⃣ cgroup / xdp(部分情况)
前提:
- attach 点是“全局唯一的”
- bpftool 能推断参数
四、什么时候 autoattach 几乎没意义 / 会失败?
❌ uprobe / uretprobe(你现在这个场景)
SEC("uprobe/malloc")
int uprobe_malloc(...) { ... }
为什么不行?
因为 uprobe 必须知道:
- 可执行文件路径(libc.so.6)
- offset 或 symbol
- pid(可选)
👉 这些信息不在 ELF 里
👉 bpftool 无法猜
所以:
autoattach
对 uprobe 来说:
- ❌ 要么直接失败
- ❌ 要么什么都没发生
- ❌ 不会验证 attach 是否“语义正确”
五、那 autoattach 的“真正意义”是什么?
用一句工程级的话说:
autoattach** 的意义,不是“帮你省事”,
****而是:
****在 attach 目标“唯一、无歧义”的情况下,
**把 load 和 attach 合并成一次原子验证。
六、autoattach 能帮你判断什么?
| 能判断 | 说明 |
|---|---|
| verifier 是否通过 | ✔ |
| section 是否合法 | ✔ |
| attach 点是否存在 | ✔ |
| BTF / fentry 是否匹配 | ✔ |
七、autoattach 判断不了什么?
| 判断不了 | 原因 |
|---|---|
| uprobe 路径是否正确 | 需要用户提供 |
| pid 是否正确 | 外部语义 |
| 程序逻辑是否正确 | verifier 不管 |
| attach 后是否真的命中 | 需要触发事件 |
八、你现在该怎么用它?(给你明确建议)
✅ 推荐用 autoattach 的场景
- tracepoint
- raw tracepoint
- fentry / fexit
- 做最小可运行验证
❌ 不推荐用的场景
- uprobe / uretprobe
- kprobe(函数名歧义)
- 需要 pid / path / fd 的 attach

浙公网安备 33010602011771号