[犯病记] DPDK报错Symbol `rte_eth_devices' has different size in shared object, consider re-linking

发布时间 2023-05-28 00:11:21作者: CQzhangyu

[犯病记] DPDK报错Symbol `rte_eth_devices' has different size in shared object, consider re-linking

背景:有一天,我犯了个病,试图在一个机器上安装DOCA,然后安装程序就下了一堆库,把机器上的环境搞得一团糟,原来的DPDK也不能用了。DOCA的安装程序不仅重新安装了一大堆库,还更换了系统内核版本,修改了网卡配置,以及更换了网卡驱动(MLNX_OFED)。为此我不得不将上述东西全部重装。

报错描述

我写了一个用DPDK的程序,编译起来没问题。但运行时,报如下错误:

Symbol `rte_eth_devices' has different size in shared object, consider re-linking

寻找报错原因

从报错信息来看可能是哪个库在链接的时候出了版本问题。于是我尝试重新编译自己的程序,不行。又重新编译了DPDK(根据官方文档),再重新编译自己的程序,结果还是报同样的错误。

这就很头疼,于是我打算看看这个库到底出了什么错误。

从字面意思上看,是说rte_eth_devices这个符号在动态编译库中出现了两次,且两次的大小不同。那我想先找到这个库的位置。根据编译DPDK时的输出信息(具体来说是执行ninja install时的输出信息),我知道这DPDK的库被安装在usr/local/lib/x86_64-linux-gnu/目录里。

进入这个目录,可以看到一大堆librte_xxx.so的文件。我查看其中一个的链接信息:

ldd /usr/local/lib/x86_64-linux-gnu/librte_ethdev.so

其中居然包含这么一行:

librte_eal.so.21 => /opt/mellanox/dpdk/lib/x86_64-linux-gnu/librte_eal.so.21 (0x00007f0f65157000)

这就令人感觉有点奇怪了。因为在另一台正常的机器上,输出应该是:

librte_eal.so.21 => /usr/local/lib/x86_64-linux-gnu/librte_eal.so.21 (0x00007fcc3d68b000)

这意味着,我们的DPDK库文件链接到了一个奇怪的地方,于是我去看这个奇怪的地方:

ls /opt/mellanox/dpdk/lib/x86_64-linux-gnu/

里面也是一大堆librte_xxx.so的文件,跟usr/local/lib/x86_64-linux-gnu/是同样的。

更具体一点,我查看这两个.so文件的大小:

nm -S /opt/mellanox/dpdk/lib/x86_64-linux-gnu/librte_ethdev.so | grep rte_eth_devices
000000000003b140 0000000001030000 B rte_eth_devices

nm -S /usr/local/lib/x86_64-linux-gnu/librte_ethdev.so | grep rte_eth_devices
00000000000264c0 0000000000081800 B rte_eth_devices

果然是不一样的!

分析

根据上面的信息,我们可以得知。是因为存在着两个文件夹,里面都包含DPDK的库,导致在链接的时候我想用的库(usr/local/lib/x86_64-linux-gnu/内的库)链接到了另外一个文件夹(/opt/mellanox/dpdk/lib/x86_64-linux-gnu/)里的库。而两个库中符号大小不同,所以在运行时报了上面的错误。

事实上,我/opt/mellanox/dpdk/这个东西就是我之前在试图安装doca时附带安装的。而正常的机器上就不会有这个文件夹。DOCA害我不浅(泪)

解决方法

/opt/mellanox/dpdk/这个文件夹删了。然后重新编译DPDK和我的程序,就好了。