1. 程式人生 > >查詢程式載入的動態庫的路徑

查詢程式載入的動態庫的路徑

事件的起因:

最近編譯gtk版的webkit後發現,他需要指令碼Tools/Scripts/run-launcher來啟動WebKitBuild/Debug/Programs的GtkLauncher、MiniBrowser等

如果正常執行會發生出下異常

[email protected]:~/study/webkit/webkit_nightly/WebKit-r150880/WebKitBuild/Debug/Programs$ ./GtkLauncher 
./GtkLauncher: error while loading shared libraries: libgstreamer-1.0.so.0: cannot open shared object file: No such file or directory

想搞清楚與做到的事:

1)為什麼需要指令碼來啟動,直接執行會出現動態庫載入異常,即為什麼動態庫搜尋不到;

2)如果直接在Programs執行GtkLauncher等需要做那些工作;

分析與解決問題;

1)根據異常資訊,是動態庫載入不到,另外加上之前發現到目前webkit gtk的編譯與之前有所不同,最大的區別在於編譯需要的依賴庫是實時編譯的,即一定在編譯目錄下的某個子目錄存放著依賴的動態庫,然後通過執行指令碼來啟動的過程中應該是為作某些工作,讓GtkLauncher等能找到需要的動態庫;

2)由第一步的分析,到編譯目錄下搜尋.so檔案,發現WebKitBuild/Dependencies/Root/lib64/下存放著n多動態庫,如下

cairo                             libcairo-script-interpreter.so.2.11200.8  libgio-2.0.so                        libgstbasevideo-1.0.so.0.7.0     libgstriff-1.0.so.0                 libharfbuzz.so
gdk-pixbuf-2.0                    libcairo.so                               libgio-2.0.so.0                      libgstcheck-1.0.so               libgstriff-1.0.so.0.7.0             libharfbuzz.so.0
gio                               libcairo.so.2                             libgio-2.0.so.0.3600.0               libgstcheck-1.0.so.0             libgstrtp-1.0.so                    libharfbuzz.so.0.914.0
girepository-1.0                  libcairo.so.2.11200.8                     libglib-2.0.so                       libgstcheck-1.0.so.0.7.0         libgstrtp-1.0.so.0                  libpixman-1.a
glib-2.0                          libffi-3.0.10                             libglib-2.0.so.0                     libgstcodecparsers-1.0.so        libgstrtp-1.0.so.0.7.0              libpixman-1.so
gnome-settings-daemon-3.0         libffi.a                                  libglib-2.0.so.0.3600.0              libgstcodecparsers-1.0.so.0      libgstrtsp-1.0.so                   libpixman-1.so.0
gstreamer-1.0                     libffi.so                                 libgmodule-2.0.so                    libgstcodecparsers-1.0.so.0.7.0  libgstrtsp-1.0.so.0                 libpixman-1.so.0.24.0
gtk-2.0                           libffi.so.5                               libgmodule-2.0.so.0                  libgstcontroller-1.0.so          libgstrtsp-1.0.so.0.7.0             librsvg-2.a
gtk-3.0                           libffi.so.5.0.10                          libgmodule-2.0.so.0.3600.0           libgstcontroller-1.0.so.0        libgstsdp-1.0.so                    librsvg-2.so
libatk-1.0.so                     libfontconfig.a                           libgobject-2.0.so                    libgstcontroller-1.0.so.0.7.0    libgstsdp-1.0.so.0                  librsvg-2.so.2
libatk-1.0.so.0                   libfontconfig.so                          libgobject-2.0.so.0                  libgstfft-1.0.so                 libgstsdp-1.0.so.0.7.0              librsvg-2.so.2.36.1
libatk-1.0.so.0.20809.1           libfontconfig.so.1                        libgobject-2.0.so.0.3600.0           libgstfft-1.0.so.0               libgstsignalprocessor-1.0.so        libsoup-2.4.a
libatk-bridge-2.0.so              libfontconfig.so.1.4.4                    libgstapp-1.0.so                     libgstfft-1.0.so.0.7.0           libgstsignalprocessor-1.0.so.0      libsoup-2.4.so
libatk-bridge-2.0.so.0            libfreetype.a                             libgstapp-1.0.so.0                   libgstnet-1.0.so                 libgstsignalprocessor-1.0.so.0.7.0  libsoup-2.4.so.1
libatk-bridge-2.0.so.0.0.0        libfreetype.so                            libgstapp-1.0.so.0.7.0               libgstnet-1.0.so.0               libgsttag-1.0.so                    libsoup-2.4.so.1.6.0
libatspi.so                       libfreetype.so.6                          libgstaudio-1.0.so                   libgstnet-1.0.so.0.7.0           libgsttag-1.0.so.0                  libxml2.a
libatspi.so.0                     libfreetype.so.6.10.0                     libgstaudio-1.0.so.0                 libgstpbutils-1.0.so             libgsttag-1.0.so.0.7.0              libxml2.so
libatspi.so.0.0.1                 libgailutil-3.so                          libgstaudio-1.0.so.0.7.0             libgstpbutils-1.0.so.0           libgstvideo-1.0.so                  libxml2.so.2
libcairo.a                        libgailutil-3.so.0                        libgstbase-1.0.so                    libgstpbutils-1.0.so.0.7.0       libgstvideo-1.0.so.0                libxml2.so.2.9.0
libcairo-gobject.a                libgailutil-3.so.0.0.0                    libgstbase-1.0.so.0                  libgstphotography-1.0.so         libgstvideo-1.0.so.0.7.0            pkgconfig
libcairo-gobject.so               libgdk-3.so                               libgstbase-1.0.so.0.7.0              libgstphotography-1.0.so.0       libgthread-2.0.so                   python2.7
libcairo-gobject.so.2             libgdk-3.so.0                             libgstbasecamerabinsrc-1.0.so        libgstphotography-1.0.so.0.7.0   libgthread-2.0.so.0                 xml2Conf.sh
libcairo-gobject.so.2.11200.8     libgdk-3.so.0.600.0                       libgstbasecamerabinsrc-1.0.so.0      libgstreamer-1.0.so              libgthread-2.0.so.0.3600.0          xorg
libcairo-script-interpreter.a     libgdk_pixbuf-2.0.so                      libgstbasecamerabinsrc-1.0.so.0.7.0  libgstreamer-1.0.so.0            libgtk-3.so
libcairo-script-interpreter.so    libgdk_pixbuf-2.0.so.0                    libgstbasevideo-1.0.so               libgstreamer-1.0.so.0.7.0        libgtk-3.so.0
libcairo-script-interpreter.so.2  libgdk_pixbuf-2.0.so.0.2600.5             libgstbasevideo-1.0.so.0             libgstriff-1.0.so                libgtk-3.so.0.600.0


3)需要驗證與核實,用指令碼啟動GtkLauncher然後檢視程式所載入的動態庫的路徑(google了一下,找到lsof這個命令)

[email protected]:~/study/webkit/webkit_nightly/WebKit-r150880$ ./Tools/Scripts/run-launcher --gtk --debug &
[1] 9825
[email protected]:~/study/webkit/webkit_nightly/WebKit-r150880$ Starting webkit launcher.
Gtk-Message: Failed to load module "canberra-gtk-module"
[email protected]:~/study/webkit/webkit_nightly/WebKit-r150880$ lsof -p 9825 | grep libgstreamer
GtkLaunch 9825 luogw  mem    REG                8,8    4311120  18000138 /home/luogw/study/webkit/webkit_nightly/WebKit-r150880/WebKitBuild/Dependencies/Root/lib64/libgstreamer-1.0.so.0.4.0

4)通過上述分析只要讓GtkLauncher正常的載入到lib64下的動態庫就不需要啟動指令碼來執行(還沒搞清楚run-launcher是怎麼做到的)

google學習了linux下程式搜尋動態庫的知識,現學現用,發現設LD_LIBRARY_PATH是一種解決方案(記得要export下變數)

相關推薦

查詢程式載入動態路徑

事件的起因: 最近編譯gtk版的webkit後發現,他需要指令碼Tools/Scripts/run-launcher來啟動WebKitBuild/Debug/Programs的GtkLauncher、MiniBrowser等 如果正常執行會發生出下異常 [email

如何將程式的執行檔案和靜態載入動態放在不同的目錄

一般windows程式的exe和dll需要放在同一個目錄,靜態載入才不會報錯,否則需要修改path環境變數,將所有沒有和exe放在同一目錄的dll的路徑加在path環境變數中。 有沒有一種方法不去手動修改path環境變數並且可以將exe和dll隨心所欲的改變路徑呢?我沒有發

關於程式執行時載入動態失敗的解決方法

一般我們在Linux下執行某些外部程式的時候可能會提示找不到共享庫的錯誤, 比如: error while loading shared libraries: libevent-1.4.so.2: cannot open shared object file: No such file or direc

Linux下修改使用者bashrc新增自定義路徑載入動態

有時候,我們在Linux下編寫的程式使用了第三方動態庫,如果當我們把程式移植到別的機器上,需要把動態庫一起移植。但是如果我們沒有系統許可權的話,就無法把動態庫放到系統目錄,從而我們的程式無法正確連結到該檔案,導致無法執行。這時,我們可以通過修改使用者目錄下的.bashrc檔

Windows平臺LoadLibrary載入動態搜尋路徑的問題

一、背景 在給Adobe Premiere/After Effects等後期製作軟體開發第三方外掛的時候,我們總希望外掛依賴的動態庫能夠脫離外掛的位置,單獨儲存到另外一個地方。這樣一方面可以與其他程式共享這些動態庫,還能保證外掛安裝時非常的清爽。就Adobe Premiere Pro/After Effec

沒有載入動態導致的error: symbol lookup error: undefined symbol

做了一個瀏覽器外掛,需要編譯為 abcPlugins.so , 這個.so需要呼叫另外一個業務庫 defLib.so裡面的函式。 把abcPlugins.so替換到目標板上,瀏覽器程序啟動不起來。   1. 查詢瀏覽器程序啟動過程錯誤    1

C++載入動態的形式來實現封裝

目錄結構 └── test ├── CMakeLists.txt ├── base.h //設定介面 ├── drive.cpp //具體實現 └── main.cpp

linux 程式動態、靜態庫內部新增版本號和編譯時間

給程式和庫新增版本號和庫,有利於維護和升級。 當然你可以在檔名上體現,比如有個程式叫 yun,檔名寫為 yun_1.0.2,但這個需要每次手動維護,而且不能100%確保當前程式就是那個版本。所以,把版本號體現在程式內部,是一個不錯的選擇。 --------------------------

OSX10.9 QT5.3.1 關於載入動態(Cannot load library.....)

在LINUX 、WINDOWS程式正常,但在MAC下卻不能載入。如下圖 在生成的APP檔案,右鍵‘顯示包內容’  位定到  fnd_main.app/Contents/MacOS,把生成的動態庫 *.dblib複製進去。 ASSERT: "uint(i) <

動態路徑配置- /etc/ld.so.conf檔案

  Linux 系統上有兩類根本不同的 Linux 可執行程式。第一類是靜態連結的可執行程式。靜態可執行程式包含執行所需的所有函式 — 換句話說,它們是“完整的”。因為這一原因,靜態可執行程式不依賴任何外部庫就可以執行。   第二類是動態連結的可執行程式。   靜態可執行程式與動態可執行程式比較   

linux設定動態路徑和環境變數

linux安裝原始碼編譯出來的庫後,如何讓系統預設識別到, 如編譯後安裝在/usr/local/aarch64-qt下 1、設定動態庫連結配置 如果不設定動態庫連線,系統就找不到需要的*.so,導致軟體執行失敗。 可以ldd一下,如: [email protected]:~$ ldd

更改PE檔案載入動態

最近看了《逆向工程核心原理》,其中第25.4節講了更改PE檔案讓目標檔案載入我們的動態庫。現在做一下完整介紹。 PE檔案的匯入DLL資訊儲存在IDT中,於是我們只需將DLL加到目標PE檔案的IDT中,這時我們得先看一下IDT的空間大小。 1.檢視IDT: 首先用PEVie

/etc/ld.so.conf詳解 及 編譯尋找動態路徑解析

轉自  http://www.cnblogs.com/chris-cp/p/3591306.html /etc/ld.so.conf 此檔案記錄了編譯時使用的動態庫的路徑,也就是載入so庫的路徑。    預設情況下,編譯器只會使用/lib和/usr/lib這兩個目錄下的

C++批量載入動態函式方法

1、列舉定義enum  {    // 0 - GigE DLL (implicitly called)    Func_isVersionCompliantDLL,    Func_isDriverAv

動態載入動態使用gflags的方法

最近做的專案,一個module需要載入多個外掛,外掛是用dlopen的方式載入的。module中使用一些gflags,而外掛中也需要使用gflags。 在module啟動時執行ParseCommandLineFlags,之後在載入外掛,讀取/proc/self/comman

cocos2dx android ndk 載入動態(.so)

當專案開發到一定階段,基本上需要接入第三方sdk的了,ios上還比較好辦,就不說了。android上步驟是比較繁瑣的。通常sdk會叫你把動態庫檔案扔到專案的libs中,但Cocos2dx在編譯時會把libs目錄下的東西清空,然後從其他地方引入的,所以不能直接放進去。關於pr

LoadLibrary載入動態失敗的解決辦法

方式一 採用LoadLibraryEx 若DLL不在呼叫方的同一目錄下,可以用LoadLibrary(L"DLL絕對路徑")載入。但若呼叫的DLL內部又呼叫另外一個DLL,此時呼叫仍會失敗。解決辦法是用LoadLibraryEx: LoadLibraryEx("DLL絕對

linux 設定執行時動態路徑

export LD_LIBRARY_PATH="/mnt/pub/libs/share:$LD_LIBRARY_PATH"   PATH和LD_LIBRARY_PATH本質都是變數,所謂變數的意思就是由別人賦值產生的,直覺往往會讓我們新增和減少這個變數本身的某些路徑

linux中動態載入動態的方法

  dlopen()是一個強大的庫函式。該函式將開啟一個新庫,並把它裝入記憶體。該函式主要用來載入庫中的符號,這些符號在編譯的時候是不知道的。比如 Apache Web 伺服器利用這個函式在執行過程中載入模組,這為它提供了額外的能力。一個配置檔案控制了載入模組的過程。這種機制使得在系統中新增或者刪除一個模組

載入動態失敗的原因分析

載入動態庫有幾方面的原因。歸納如下: 1) 動態庫路徑錯誤。 2) 動態庫依賴缺失。這個可以利用depends工具看下依賴情況。如果缺失,請尋找相應庫,然後把相應庫放在程式同一目錄下,或者放在system32目錄下。 3) 依賴動態庫本身有問題。這個最難定位。有的時候,依賴