在使用 libpcap.so 库修改 pcap 数据包文件时,遇到了 symbol lookup error:libpcap.so: undefined symbol pcap_dump_open_append 的错误问题。pcap_dump_open_append 是 libpcap.so 的函数啊,明明调用的 libpcap.so 内的其他函数的时候没有问题,怎么这个函数会没有定义找不到呢? 很是疑惑。 

并且还是只有当调用这个函数 pcap_dump_open_append 的语句执行到的时候才会报错;没执行这个语句的时候还不会报错。

解决方法,在中文互联网中没有搜索到解决方法但是有相关的问题给我提供了灵感,使用 ldd 查看生成的程序链接的 libpcap.so 是否正确,去 lib 的目录下去看,不看不知道,一看就有问题,总共有四五个  libpcap.so 库,哈哈哈

最后还是在英文互联网中搜到了问题的所在。

链接:run error: undefined reference to 'pcap_dump_open_append' · Issue #1140 · the-tcpdump-group/libpcap · GitHub

遇到这个问题首先看看 pcap.h 这个文件,一般的路径是 

/usr/local/include/pcap/pcap.h

打开看一下:存在这个函数。

723 PCAP_AVAILABLE_1_7
724 PCAP_API pcap_dumper_t *pcap_dump_open_append(pcap_t *, const char *);

注: 上面的两行代码是我安装的版本是 libpcap-1.10.1的 pcap.h 的头文件复制的。

再按照 libpcap 的 git 上的问题的解答过程操作一遍,

首先看到的一个信息是 pcap.h show me that pcap_dump_open_append was avaliable in 1.7,

即该函数在 1.7 版本中才新增的函数,说明在低版本中没有这个函数。  

比如我最终编译的的程序名字叫 a.out

step1: 使用 ldd 命令搜索链接的 libpcap 库的路径。

ldd a.out | grep libpcap

step2: 使用 string 命令在 libpcap 库中搜索版本号的字符串。使用 nm 命令查找函数 pcap_dump_open_append

注:下面两行中的 <path> 指的是用 ldd 命令查到的 libpcap.so 库的路径。

strings <path> | grep 'libpcap version'
nm <path> | grep pcap_dump_open_append

我的问题到这里已经找到了,a.out 程序用的 libpcap.so 库的版本低于 1.7 版本,是 1.5 版本没有

pcap_dump_open_append 这个函数。

所以我需要做的是修改 a.out 程序 链接的 libpcap.so 库的文件,链接一个高于 1.7 版本,并且使用 nm <path> | grep pcap_dump_open_append 命令可以查到 pcap_dump_open_append 函数的一个 libpcap 库。

那我要怎么做呢?

把 libpcap.so 库复制到与 a.out 程序的同一目录内。

使用下面的这个命令就可以了:

export LD_PRELOAD=”./libpcap.so” #设置 LD_PRELOAD 环境变量,库中的同名函数在程序运行时优先调用

问题到此解决。

下次再遇到 symbol lookup error:XXX.so: undefined symbol 的问题的解决思路:

1. 先查找相关的头文件,看有没有这个函数 或 “这个symbol”  存在不存在。

2. 使用 ldd 命令搜索这个函数所在的动态库链接的路径。

3. 使用 strings 命令查看版本号。

4. 使用 nm 命令查找这个symbol(符号)。

一个修改链接库文件的命令 :export LD_PRELOAD=”./libpcap.so”

                                                                                                               No.5  2023/3/23 晚 大雨

完~

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐