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
posted @ 2026-06-02 00:21  BlackSnow  阅读(28)  评论(0)    收藏  举报