2011-10-25 29 views
5

我想以編程方式獲得通過我在Linux和Solaris二進制鏈接的共享庫的列表。現在,我掏出來PMAP(我不能在二進制使用ldd,因爲它不包括dlopen'd庫,我不能用pldd,因爲它只的Solaris):如何從C++獲取可執行的共享庫列表?

std::ostringstream cmd; 
cmd << "/usr/bin/pmap " << getpid() << " | awk '{ print $NF }' | grep '\\.so' | sort -u"; 
FILE* p = popen(cmd.str().c_str(), "r"); 

這是一個有點hackish,但它適用於Solaris和Linux(在PMAP輸出稍有不同,但所需的信息總是在最後一欄)。有沒有辦法在不脫殼的情況下獲得相同的信息?這在兩個平臺上都可行?我假設/proc/$PID文件的格式它們之間的不同,但我不知道在哪裏幫助那些解析頭通常位於(如果有一個共同的位置呢?)。

+0

嚴格來說''dlopen'ed庫不是「鏈接」的,它們在運行時加載。我假設你真的想要所有加載的共享庫列表? –

+0

這是正確的。 –

回答

2

可以使用pmap 1234命令1234是一個進程ID。

從你的程序中,更簡單的方法(特定於Linux)是讀取和解析/proc/self/maps文件。

嘗試運行

cat /proc/self/maps

Linux下:它會告訴你運行上面的命令cat進程的內存映射。

如果您有一些精確的指針,您可以使用dladdr(GNU/Linux或Glibc特定函數)來獲取有關哪個動態庫包含它的信息。

相關問題