実際には、次の方法でコード内でこれを行うことができます:
#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 を一覧表示します - 非常にクールです...