On Tue, Aug 25, 2026 at 8:05 AM Jiayuan Chen <[email protected]> wrote: > > The kernel refuses to attach to a nop10 that crosses a page boundary, > since it can't be atomically rewritten: > > /* can_optimize(), arch/x86/kernel/uprobes.c */ > /* We can't do cross page atomic writes yet. */ > return PAGE_SIZE - (vaddr & ~PAGE_MASK) >= OPT_INSN_SIZE; > > Whether the nop10 crosses a page is purely up to the binary layout, so > this does happen in practice. libbpf doesn't check for it and blindly > shifts the uprobe onto the nop10, and the attach then fails with > -ENOTSUPP. Just keep the uprobe on the preceding 1-byte nop in that > case, it works everywhere as a regular int3 uprobe. > > Fixes: ee2862439e5c ("libbpf: Change has_nop_combo to work on top of nop10") > Signed-off-by: Jiayuan Chen <[email protected]> > > --- > v1 -> v2: move check into has_nop_combo. > v1: > https://lore.kernel.org/bpf/[email protected]/ > --- > tools/lib/bpf/usdt.c | 4 ++++ > 1 file changed, 4 insertions(+) > > diff --git a/tools/lib/bpf/usdt.c b/tools/lib/bpf/usdt.c > index 2e56e3ab5b6c..ee9d1b614883 100644 > --- a/tools/lib/bpf/usdt.c > +++ b/tools/lib/bpf/usdt.c > @@ -608,8 +608,12 @@ static bool has_nop_combo(int fd, long off) > unsigned char nop_combo[11] = { > 0x90, 0x66, 0x2e, 0x0f, 0x1f, 0x84, 0x00, 0x00, 0x00, 0x00, > 0x00, > }; > + long page_sz = getpagesize(); > unsigned char buf[11]; > > + /* the kernel can't attach to a nop10 that crosses a page boundary */ > + if ((off + 1) % page_sz + 10 > page_sz) > + return false;
yeah, this works ok, applied this version, disregard request to unify has_nop_combo() with man->has_uprobe_syscall check > if (pread(fd, buf, 11, off) != 11) > return false; > return memcmp(buf, nop_combo, 11) == 0; > -- > 2.43.0 >

