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
>

Reply via email to