簡體   English   中英

在c ++(linux)中獲取動態庫目錄

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM