2017-10-08 57 views
0

我目前正在研究一個用戶級的ELF文件加載器在C. LD_LIBRARY_PATH似乎不是我的選擇,因爲它似乎沒有設置默認情況下在我的系統上(x86_64 openSUSE)。獲取存儲庫的所有目錄的最佳方式是什麼?什麼是最好的方式來尋找在Linux下的ELF共享庫在C

+3

'man ldconfig'有你需要的所有答案 – myaut

+0

爲什麼你需要一個用戶級的ELF文件加載器?你的問題太短,缺乏動力和背景。請**編輯您的問題**以改善它。 –

回答

1

/usr/lib64/lib64爲64位二進制或/usr/lib/lib爲32位二進制文​​件,比從/etc/ld.so.conf採取的路徑和包括CONFIGS

man ldconfig

ldconfig創建必要的鏈接和高速緩存在文件/etc/ld.so.conf和受信任的目錄/lib/usr/lib(在命令行中指定的目錄中找到的最新共享庫在一些64位體系結構上,如x86-64,/lib/usr/lib是32位庫的可信目錄,而/lib64/usr/lib64用於64位庫)。

緩存由運行時鏈接程序ld.so或ld-linux.so使用。

...包含目錄,每行一個,在其中搜索庫的列表

文件/etc/ld.so.conf。

請注意,此信息針對openSUSE,其他發行版可能使用不同的路徑。

+0

其他發行版可以使用不同的目錄來存儲共享庫,但機制是一樣的......這些目錄在'/etc/ld.so.conf'中列出。 –

1

LD_LIBRARY_PATH是標準環境變量,用於在用戶無法或無法訪問系統目錄安裝共享庫時添加和加載自己的庫。

有它通常由ldconfig在啓動時讀取一個文件(它讀取/etc/ld.so.conf創建一個二進制DBMsomewhat文件/etc/ld.so.cache,利用哈希表來快速訪問路徑加載庫共享對象時使用,而且所使用的動態加載器(作爲一個內核工具,只有一個這樣的東西,所以它不依賴於你運行的是哪個發行版,而僅僅依賴於你使用的內核版本---它有所改變,但不像內核那樣多---)

要知道哪個sonames(soname是共享對象用於引用接口的通用名稱,這是保證共享對象將需要的接口l條與磁帶庫兼容)正在使用的動態加載器,只需運行

ldconfig -p 

,你會得到所有的sonames註冊,並且路徑庫實際加載該SONAME。

如果你想知道哪些圖書館將通過動態加載某些特定的可執行文件被加載,只是執行此:

ldd your_executable 

,它將打印sonames該可執行文件的需求並在系統中的他們位於。

ldconfig(8)做什麼,是搜索人包括在文件/etc/ld.so.conf共享目標文件的目錄,並期待所有的名字存儲在文件中的soname匹配的,幷包括對命名爲SONAME文件的引用找到。表完成後,/etc/ld.so.cache文件被創建並由/lib64/ld-linux-x86-64.so.2使用,該文件是負責用戶模式加載程序使用的其餘共享庫的共享模塊。

有在具有本地$HOME/lib目錄來存儲你的本地開發的共享庫,沒有問題,但由於該目錄將無法正常納入/etc/ld.so.conf,你需要創建LD_LIBRARY_PATH=${HOME}/lib和小心出口嗎,和永遠不要嘗試將其作爲root用戶使用,對於root用戶,env變量被禁用。

編輯1

順便說一句,如果你需要按需加載共享庫(這可能是你所需要的,可能),瞭解dlopen(3)和朋友的功能,因爲這是最常用的方法在編譯主程序之前動態加載你沒有聽說過的模塊的程序。您需要加載模塊,查找需要的符號(dlsym(3)dlfunc(3)),以存儲模塊給出的引用,最後調用它們。

相關問題