You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

eBPF uprobe附加静态链接程序函数地址报Invalid argument问题

问题根因

不存在所谓uprobe最大可附加地址限制,该问题是aarch64架构5.15版本内核uprobe实现对非PIE静态链接可执行文件的地址处理缺陷,叠加使用方式不匹配导致:

  • 动态链接场景下,gcc默认生成PIE(位置无关可执行文件,ELF类型为ET_DYN)程序,这类程序的符号虚拟地址从0开始编址,符号的st_value(即objdump查到的符号地址)与符号在二进制文件内的偏移完全一致,直接传入该地址符合内核uprobe接口要求的「文件偏移」参数规则,因此附加正常。
  • 静态链接时如果未手动指定PIE参数,g++默认生成非PIE的可执行文件(ELF类型为ET_EXEC),这类程序的默认加载虚拟基址为0x400000,你查到的fibonacci函数地址0x401424是运行时虚拟内存地址,并非内核要求的文件内偏移,实际对应文件偏移应为0x401424 - 0x400000 = 0x1424。
  • 5.15版本aarch64内核的uprobe地址校验逻辑存在缺陷:处理ET_EXEC类型文件时,直接将传入的偏移值与代码段的文件长度做比较,未做虚拟地址到文件偏移的映射转换,你传入的0x401424远大于代码段实际文件长度,因此直接返回-EINVAL错误,对应libbpf报的Invalid argument。
  • 你测试中能附加成功的0x280E98地址,只是刚好落在内核校验允许的偏移范围内,该位置没有有效代码映射,属于无效附加,不会触发探针逻辑。
解决方案

可任选以下一种方案修复:

  • 方案1(推荐,改动最小):静态编译时开启PIE支持,让静态链接生成的二进制为ET_DYN类型,与现有动态链接场景的附加逻辑完全兼容。在CMake配置中为目标追加编译和链接参数即可:
    编译选项添加-fPIE,链接选项同时携带-static -pie,示例配置:
    target_link_libraries(fibonacci -static -pie)
    重新编译后直接使用objdump查到的符号地址附加uprobe即可正常工作。
  • 方案2:如果无法开启PIE,附加uprobe时不要直接传入符号的虚拟地址,手动计算文件内偏移:通过readelf -l fibonacci查看程序LOAD段中可执行代码段的虚拟起始基址(默认通常为0x400000),用符号的虚拟地址减去该基址得到真实文件偏移,将该偏移传入bpf_program__attach_uprobe_opts的offset参数即可。
  • 方案3:将系统内核升级到5.18及以上版本,aarch64架构uprobe对非PIE静态可执行文件的地址校验bug在该版本后已合入修复,无需手动计算偏移即可正常附加。

内容的提问来源于stack exchange,提问作者Dennis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 18:22:20