symbol lookup error:XXX.so: undefined symbol: 解决办法----以 libpcap.so 的 pcap_dump_open_append 函数为例

文章描述了在使用libpcap.so库时遇到的undefinedsymbol问题,具体是函数pcap_dump_open_append未找到。作者通过检查头文件、使用ldd和nm命令,发现是由于使用的libpcap.so版本过低导致。解决方案是更新libpcap库至1.7及以上版本,并通过设置LD_PRELOAD环境变量来优先加载正确的库。
摘要由CSDN通过智能技术生成

在使用 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 晚 大雨

完~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值