pretty code

2023年11月3日 星期五

Magic symbol - _ZN6google15ErrnoLogMessageC1EPKciimMNS_10LogMessageEFvvE

同事最近在搞 Vitis-AI 的板子,過程中遇到一些問題,花了一天多的時間幫忙釐清並解決編譯問題,還是稍微記錄一下好了XD

這個 magic string 就是所謂的 name mangling,請看這裡

環境介紹:同事沒有使用 PetaLinux 而是使用 Ubuntu 22.04。

同事在執行下面這支 script 時發生問題,一開始就跑不起來,看了 code 後發現,並沒有人去呼叫 main function,故需要改成先帶 main 再帶 target board 型號的方式來執行此 script。(後來才發現 Xilinx 文件是錯的,4.3.2 有錯,但 4.3 有稍微提到 run_all_target.sh 這支 script,裡面就可以看到正確呼叫 run_all_cifar10_target.sh 的參數傳法)

Vitis-AI-Tutorials/Tutorials/RESNET18/files/target/run_all_cifar10_target.sh

再來還是跟執行 run_all_cifar10_target.sh 有關的錯誤。

01.  missing symbol - _ZN6google15ErrnoLogMessageC1EPKciimMNS_10LogMessageEFvvE

這個名稱是 gcc 在編譯函數等 object 時所定義的 symbol name,gcc 是 follow 這個文件,我們也可以把這串名字丟到此網站,我們就可以看到此 symbol 的原型宣告如下:

google::ErrnoLogMessage::ErrnoLogMessage(char const*, int, int, unsigned long, void (google::LogMessage::*)())

同事的問題就是在安裝的 glog 中找不到同樣名稱的函數,嚴格說起來是差在第 4 個參數,我們跟這串文字差了一個 m,而這個 m 就表示參數是 unsigned long。

同事還蠻幸運的,在降版本到第二個版本後,就順利編譯出有一樣 symbol 的 so 檔。

02. missing symbol - xclIPSetReadRange

這個問題跟上面類似,也是版本相關的 issue,後來在 review XRT 版本後,確定某些版本以前的 code 確實缺少了這個函數(XRT/src/runtime_src/core/pcie/linux/shim.cpp),後來便決定使用 202220.2.14.354。

底下是自己編譯此版本會遇到的問題。

首先在 sudo <XRT>/src/runtime_src/tools/scripts/xrtdeps.sh 時,會看到類似沒有安裝 gcc 8 的訊息,因為環境已經有 gcc 11 了。

接著執行 build.sh 發現很快就結束了,原因是 script 中,gcc 版本是 hard code 寫死,直接改成對應的版本即可,接下來就是一連串的 sudo apt-get install 地獄XD

此 script 會先執行 configure 相關工作,反正遇到什麼錯誤就 google 一下,安裝對應的 xxx-dev 版本即可,印象中有 4 ~ 5 個要裝。

最麻煩的是在 runtime_src/xdp/CMakeLists.txt:427 會報找不到 xdp_hw_emu_device_offload_plugin 錯誤,但這個東西如果我沒搞錯應該是編譯時才會編譯,懷疑是 CMakeLists.txt 沒寫好,可能跟相容 cross-compile 有關?

想了一下,直接註解 427 及 428 行即可。

接下來是一連串的 build error,最糟糕的都是直到編譯某支檔案時才會報找不到 header file 的錯誤,此時也只能一個一個 apt-get 安裝,印象編譯到 40 幾趴還會有錯誤,大概也是有 4 ~ 5 個要安裝,之後便可以順利編譯出 Debug 和 Release 版本了。

接著使用 objdump -T xxx_core.so | grep xclIPSetReadRange 確認一下,這次就可以順利看到 symbol。

由於 Release 版本還在編譯,簡單使用 export LD_LIBRARY_PATH=/XXX/Debug 來讓執行時可以找到 xxx_core.so 的 xclIPSetReadRange symbol 來驗證是否有順利解決問題。

花了一天多幫同事搞定這個問題,最後還是沒能在 target board 跑出想要的結果,但這又是另一個故事了XD

2023/11/24 更新

為了寫技術文件,從零亂的計算紙中找到蛛絲馬跡,凡走過必留下痕跡。

fix configure error

sudo apt-get install libdrm-dev
sudo apt-get install ocl-icd-opencl-dev
sudo apt-get install libncurses5-dev
sudo apt-get install libssl-dev
sudo apt-get install rapidjson-dev

-------------
CMake Error at runtime_src/xdp/CMakeLists.txt:427 (add_dependencies):
  The dependency target "xrt_hwemu" of target
  "xdp_hw_emu_device_offload_plugin" does not exist.

https://github.com/Xilinx/XRT/issues/6942

fix it
comment runtime_src/xdp/CMakeLists.txt line427, line428

-------------------------------------------------------------------
fix build error

sudo apt-get install uuid-dev
sudo apt-get install ocl-icd-dev
sudo apt-get install libcurl-dev
sudo apt-get install libudev-dev

沒有留言: