Dynamic-Linking

ldconfig 找到庫文件,但 ldd 找不到

  • October 15, 2015

我已經建構了 OpenGL 加速庫(libGL 和 libGLU),我將它們保存在一個特定的目錄中,/usr/lib/mali. 我還有一個 OpenGL 的軟體實現,它安裝在/usr/lib/arm-linux-gnueabihf. 這兩個目錄都是先添加的/etc/ld.so.conf/usr/lib/mali因此程序更喜歡其中的庫。

ldconfig找到所有庫:

$ sudo ldconfig -v
/usr/lib/mali:
libGLU.so.1 -> libGLU.so.1
libGL.so.1.2.0 -> libGL.so.1
/usr/lib/arm-linux-gnueabihf:
libGL.so.1 -> libGL.so.1.5.08005
libGLU.so.1 -> libGLU.so.1.3.08005

奇怪的部分是ldconfig創建了一個符號連結libGL.so.1.2.0,但對libGLU. ldd輸出更奇怪:

ldd `which glxgears`
libGLU.so.1 => /usr/lib/mali/libGLU.so.1 (0xb6e4a000)
libGL.so.1 => /usr/lib/arm-linux-gnueabihf/libGL.so.1 (0xb6bb5000)
libGL.so.1.2.0 => /usr/lib/mali/libGL.so.1.2.0 (0xb67f1000)

輸出表明它libGLU取自硬體加速目錄,同時libGL堅持軟體實現。libGL.so.1.2.0由於某種原因也被載入。最後,我執行時使用軟體實現glxgears

誰能解釋我發生了什麼事?我可以做些什麼來讓我的硬體加速庫預設載入,而不刪除或覆蓋軟體庫/usr/lib/arm-linux-gnueabihf/(它們實際上是包依賴項)?

PS:當我添加/usr/lib/mali/LD_LIBRARY_PATH.

問題確實出在我的 Makefile 設置中。檢查庫並objdump發現根本原因:

$ objdump -p libGL.so.1 |grep SONAME
SONAME               libGL.so.1.2.0

ldd顯示兩個libGL.so.1and libGL.so.1.2.0,因為第一個是由我導入的glxgears,第二個是由我的實現導入的,libGLU它是針對硬體加速版本建構的libGL,因此知道它的 soname libGL.so.1.2.0,.

解決方法是用-soname,libGL.so.1.

引用自:https://unix.stackexchange.com/questions/222396