[英]Get dynamic library directory in c++ (linux)
是否有任何編程方式來獲取程序加載的動態庫的位置?
我知道可以獲得'可執行'運行路徑。 但這對我來說還不夠。
我正在開發一個具有一些依賴關系的外部庫,我需要相應地指出它的位置。
例如,程序運行在:
/local/deepLearning/bin
此程序使用位於以下位置的動態庫:
/local/external/libs/faciesAnalysis
我需要的是,在運行時,字符串
"/local/external/libs/facesAnalysis"
我正在研究linux,有什么建議嗎?
由於這是專門的Linux, dladdr()
是dl
系列函數的glibc擴展,它將查找任何符號的文件名。 傳遞一個你知道存在於你正在尋找的庫中的符號,你基本上已經完成了。
沒有適當的錯誤檢查提出:
#define _GNU_SOURCE
#include <dlfcn.h>
const char *my_fname(void) {
Dl_info dl_info;
dladdr((void*)my_fname, &dl_info);
return(dl_info.dli_fname);
}
首先(這是Linux特有的,因為內核提供),你可以解析程序內部的/proc/self/maps
偽文件。 只需按順序讀取該文本文件的每一行,您就可以獲得每個mmap
-ed文件的完整路徑,包括共享庫。 請參閱proc(5) (並使用dirname(3)從路徑中獲取目錄,也許還有realpath(3) ...)。 另請閱讀dlopen(3) & ld-linux.so(8)並注意LD_LIBRARY_PATH
和/etc/ld.so.conf
的作用
然后,這是特定於GNU libc (但顯然musl-libc也有),你可以在該庫的某些函數地址上使用dladdr(3) 。 或者只使用看起來非常適合您的問題的dl_iterate_phdr(3) 。
提防怪異的情況:某些程序可能會產生一個插件,並dlopen
后,它(我的MELT正在做的是 ),其他一些程序可能會remove
后一個插件dlopen
,有些程序可能會被靜態鏈接時, dlopen
-ed插件可能已被移動或重命名(也許是因為在你的程序運行時安裝了新版本)...,同一個插件可能已經使用不同的路徑進行符號鏈接和傾斜等等...
閱讀Drepper的論文: 如何編寫共享庫
您可以獲得可執行文件的完整路徑( std::string path_and_exe
),然后執行以下命令:
#include <cstdlib>
std::string output("output.txt");
system ("ldd " + path_and_exe + " > " + output);
// read libray paths from output file
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.