GNU/Linux >> Linux の 問題 >  >> Linux

特定のプロセスの実行時にどの共有ライブラリがロードされているかを確認する方法は?

実際には、次の方法でコード内でこれを行うことができます:

#include <link.h>

using UnknownStruct = struct unknown_struct {
   void*  pointers[3];
   struct unknown_struct* ptr;
};
using LinkMap = struct link_map;

auto* handle = dlopen(NULL, RTLD_NOW);
auto* p = reinterpret_cast<UnknownStruct*>(handle)->ptr;
auto* map = reinterpret_cast<LinkMap*>(p->ptr);

while (map) {
  std::cout << map->l_name << std::endl;
  // do something with |map| like with handle, returned by |dlopen()|.
  map = map->l_next;
}

link_map 構造体には、少なくともベース アドレスと絶対ファイル名が含まれます。 dlopen() によって実際に返される構造です 最初の引数が NULL でない場合。詳細については、こちらを参照してください。


他の人々は正しい軌道に乗っています。いくつかの方法があります。

cat /proc/NNNN/maps | awk '{print $6}' | grep '\.so' | sort | uniq

または、strace を使用:

strace CMD.... 2>&1 | grep -E '^open(at)?\(.*\.so'

これらは両方とも、共有ライブラリがパスのどこかに「.so」を持っていることを前提としていますが、それは変更できます。最初のものは、1行に1つずつ、ライブラリのリストとしてかなりきれいな出力を提供します。 2 つ目は、ライブラリが開かれるたびにリストを表示し続けるので、これは便利です。

そしてもちろん lsof ...

lsof -p NNNN | awk '{print $9}' | grep '\.so'

lsof かもしれません - Linux のスイス アーミー ナイフが役に立ちますか?

編集:実行するには、lsof -p <pid> 、あらゆる種類の有用な情報を一覧表示します。たとえば、プロセスが Java の場合、開いているすべての jar を一覧表示します - 非常にクールです...


Linux
  1. 同じが実行されている場合はプロセスを確認しますか?

  2. 共有ライブラリの「どれ」に相当しますか?

  3. プロセスがリッスンしている信号を確認する方法は?

  1. 時間コマンドでBashスクリプトの実行にかかる時間を確認する

  2. libtool の .la ファイルは何のためのものですか?

  3. 共有オブジェクトからエクスポートされたすべてのシンボルを確認するにはどうすればよいですか?

  1. Linux でプロセスのヒープ サイズを確認する方法

  2. 共有ライブラリを構築するための「soname」オプションは何ですか?

  3. 特定の期間実行するように tcpdump をスケジュールする方法は?