[犯病記] DPDK報錯Symbol `rte_eth_devices' has different size in shared object, consider re-linking

[犯病記] 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和我的程序,就好了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章