文章目录
AttributeError: /lib/x86_64-linux-gnu/libbcc.so.0: undefined symbol: bpf_module_create_b
背景
在Ubuntu22的虚拟机中,使用源码编译并安装好bcc工具库后,执行bcc工具python3 /usr/share/bcc/tools/execsnoop报错。
报错信息
报错信息如下:
root@ubuntu2204vm:/usr/share/bcc/tools# ./execsnoop
Traceback (most recent call last):
File "/usr/share/bcc/tools/./execsnoop", line 23, in <module>
from bcc import BPF
File "/usr/lib/python3/dist-packages/bcc/__init__.py", line 27, in <module>
from .libbcc import lib, bcc_symbol, bcc_symbol_option, bcc_stacktrace_build_id, _SYM_CB_TYPE
File "/usr/lib/python3/dist-packages/bcc/libbcc.py", line 20, in <module>
lib.bpf_module_create_b.restype = ct.c_void_p
^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3.11/ctypes/__init__.py", line 389, in __getattr__
func = self.__getitem__(name)
^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3.11/ctypes/__init__.py", line 394, in __getitem__
func = self._FuncPtr((name_or_ordinal, self))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
AttributeError: /lib/x86_64-linux-gnu/libbcc.so.0: undefined symbol: bpf_module_create_b
解决方法
网上的目前的解决办法
主要还是python版本问题,将python2切换为python3。而我这边显然不是这个问题,因为我的机子上只有python3
复制已编译的bcc库中的python bcc库到python3的库中
cp -r /root/ebpf/bcc/build/src/python/bcc-python3/bcc/* /usr/lib/python3/dist-packages/bcc/
错误分析过程
报错的相关路径
根据报错信息,和报错相关的路径:
/lib/x86_64-linux-gnu/libbcc.so.0
: bcc库采用的libbcc.so.0
/usr/lib/python3/dist-packages/bcc
: 报错的bcc库
python版本检测
使用的均为python3,没有python2,所以不存在版本问题
# update-alternatives --config python
There are 2 choices for the alternative python (providing /usr/bin/python).
Selection Path Priority Status
------------------------------------------------------------
* 0 /usr/bin/python3.11 2 auto mode
1 /usr/bin/python3.10 1 manual mode
2 /usr/bin/python3.11 2 manual mode
libbcc库检查
# ls -lh /lib/x86_64-linux-gnu/ |grep libbcc
-rw-r--r-- 1 root root 5.0M May 1 19:34 libbcc.a
-rw-r--r-- 1 root root 1.5M May 1 19:33 libbcc_bpf.a
lrwxrwxrwx 1 root root 15 Jan 18 2021 libbcc_bpf.so -> libbcc_bpf.so.0
lrwxrwxrwx 1 root root 20 May 1 19:35 libbcc_bpf.so.0 -> libbcc_bpf.so.0.27.0
-rw-r--r-- 1 root root 51K Jan 18 2021 libbcc_bpf.so.0.18.0
-rw-r--r-- 1 root root 2.8M May 1 19:33 libbcc_bpf.so.0.27.0
-rw-r--r-- 1 root root 243K May 1 19:33 libbcc-loader-static.a
lrwxrwxrwx 1 root root 11 Jan 18 2021 libbcc.so -> libbcc.so.0
lrwxrwxrwx 1 root root 16 May 1 19:35 libbcc.so.0 -> libbcc.so.0.27.0
-rw-r--r-- 1 root root 3.3M Jan 18 2021 libbcc.so.0.18.0
-rw-r--r-- 1 root root 105M May 1 19:34 libbcc.so.0.27.0
可以看到libbcc库的实际指向为:
libbcc.so.0 -> libbcc.so.0.27.0
根据报错内容,python库需要bpf_module_create_b,而libbcc.so.0.27.0中没有
可以通过以下命令查看:
# strings /lib/x86_64-linux-gnu/libbcc.so.0.27.0 |grep bpf_module_create_
bpf_module_create_c
bpf_module_create_c_from_string
bpf_module_create_c.cold
bpf_module_create_c_from_string.cold
bpf_module_create_c
bpf_module_create_c_from_string
此时注意到上一个步骤中的libbcc.so.0.18.0,同样进行bpf_module_create_b检查
# strings /lib/x86_64-linux-gnu/libbcc.so.0.18.0 |grep bpf_module_create_
bpf_module_create_b
bpf_module_create_c
bpf_module_create_c_from_string
发现存在bpf_module_create_b,即便不进行时间对比,通过版本号0.18.0与0.27.0也知道,
python3的bcc库竟然请求的是老版(0.18.0)的bcc lib库
python3 bcc库检查
# ll /usr/lib/python3/dist-packages/bcc/
total 212
drwxr-xr-x 3 root root 4096 May 2 00:13 ./
drwxr-xr-x 156 root root 12288 May 1 19:36 ../
-rw-r--r-- 1 root root 2566 Jan 18 2021 containers.py
-rw-r--r-- 1 root root 20914 Jan 18 2021 disassembler.py
-rw-r--r-- 1 root root 58581 Jan 18 2021 __init__.py
-rw-r--r-- 1 root root 12951 Jan 18 2021 libbcc.py
-rw-r--r-- 1 root root 4693 Jan 18 2021 perf.py
drwxr-xr-x 2 root root 4096 May 1 19:37 __pycache__/
-rw-r--r-- 1 root root 9656 Jan 18 2021 syscall.py
-rw-r--r-- 1 root root 40588 Jan 18 2021 table.py
-rw-r--r-- 1 root root 1604 Jan 18 2021 tcp.py
-rw-r--r-- 1 root root 9102 Jan 18 2021 usdt.py
-rw-r--r-- 1 root root 4904 Jan 18 2021 utils.py
-rw-r--r-- 1 root root 23 Jan 18 2021 version.py
根据文件时间可以确定,确实都是21年的老库,遂进行替换,先查找bcc源码中的bcc python库:
# find / -name libbcc.py -ls 2>/dev/null
2360806 16 ... 12951 Jan 18 2021 /usr/lib/python3/dist-packages/bcc/libbcc.py
1054215 16 ... 14561 May 1 19:32 /root/ebpf/bcc/build/src/python/bcc-python3/build/lib/bcc/libbcc.py
1053905 16 ... 14561 May 1 19:32 /root/ebpf/bcc/build/src/python/bcc-python3/bcc/libbcc.py
1052874 16 ... 14561 May 1 19:31 /root/ebpf/bcc/src/python/bcc/libbcc.py
因为笔者对python并不算熟悉,不知道如何进行正确替换,所以直接进行的复制
cp -r /root/ebpf/bcc/build/src/python/bcc-python3/bcc/* /usr/lib/python3/dist-packages/bcc/
替换后再次执行bcc命令,问题成功得到解决,效果如下:
# ./execsnoop
PCOMM PID PPID RET ARGS
sshd 7924 909 0 /usr/sbin/sshd -D -R
00-header 7928 7927 0 /etc/update-motd.d/00-header
uname 7929 7928 0 /usr/bin/uname -o
uname 7930 7928 0 /usr/bin/uname -r
uname 7931 7928 0 /usr/bin/uname -m