2011-10-25 21 views
5

LinuxとSolarisでバイナリでリンクされた共有ライブラリのリストをプログラムで取得したいと思います。今、私は(それがdlopen'dライブラリが含まれませんので、私はバイナリにlddを使用することはできません、それが唯一のSolarisだから、私はplddを使用することはできません)のpmapに殻から取り出す:C++から実行可能な共有ライブラリのリストを取得するには?

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

これは、少しハッキリしますが、SolarisとLinuxの両方で動作します(pmapの出力は少し異なりますが、必要な情報は常に最後の列にあります)。同じ情報を砲撃することなく入手する方法はありますか?両方のプラットフォームで動作しますか?私は/proc/$PIDファイルのフォーマットが異なっていると仮定していますが、一般的な場所を解析するためのヘッダーがどこにあるのかわかりません(共通の場所がある場合は?)。

+0

厳密に言えば、 'dlopen'edライブラリはリンクされておらず、実行時に読み込まれます。私はあなたが実際にロードされた共有ライブラリのリストを望んでいると思いますか? –

+0

それは正しいです。 –

答えて

2

pmap 1234コマンドは、1234をプロセスIDとして使用できます。

より簡単な方法(Linux固有)は、/proc/self/mapsファイルを読み込んで解析することです。

は、Linuxの下で

cat /proc/self/maps

を実行してみましょう:それはあなたが上記のcatのコマンドを実行しているプロセスのメモリマッピングを表示します。

正確なポインタがある場合は、dladdr(GNU/LinuxまたはGlibc固有の関数)を使用して、どのダイナミックライブラリにそれが含まれているかについての情報を得ることができます。

関連する問題