アドレスを解決するために bfd を使用して、C++ でコールスタックを作成する小さな関数を作成しました。正常に動作し、現在のアプリケーション内のすべての関数の詳細情報 (ソース ファイルと行) を取得しますが、アプリケーションに含まれる共有ライブラリに関する情報はまったく得られません。
例えば:
callstack:
[0x00002b54229ba6d3 .none] <not sectioned address>
[0x00002b5422927907 .none] <not sectioned address>
[0x00002b54229286d0 .none] <not sectioned address>
[0x00000000004f8608 .text] tensorNetwork.hxx:63 (inside operator())
[0x00000000005528da .text] /usr/include/c++/4.8/functional:2058 (inside _M_invoke)
[0x000000000058231c .text] /usr/include/c++/4.8/functional:2469 (inside std::function<bool ()>::operator()() const)
[0x00000000005806c0 .text] test.cpp:26 (inside ___test(std::pair<std::string, std::function<bool ()> > const&))
[0x0000000000581693 .text] test.cpp:119 (inside main)
[0x00002b5423fdebe5 .none] <not sectioned address>
[0x000000000042c129 .text] /home/abuild/rpmbuild/BUILD/glibc-2.18/csu/../sysdeps/x86_64/start.S:125 (inside _start)
ご覧のとおり、アプリケーションにリンクされた実行可能ファイルと静的オブジェクトのシンボルは正しく解決されていますが、上位範囲のアドレス (例: 0x00002b54229ba6d3) は解決されていません。これらのアドレスは、アプリケーションまたは共有ライブラリ ファイルの一部ではありません。このようなさらなるツールaddr2line
は、その命令の位置を再構築することもできません。
これらのアドレスをbfdツールで解決できないことは、ディスク上のファイルを開いてシンボルを取得するだけである限り(現在行っていることはabfd = bfd_openr("/proc/self/exe", 0);
)、現在実行中のプロセスのbfdを取得する方法はありますか(したがって、共有ライブラリのセクションを含めます)?そうでない場合: ロードされた共有オブジェクトとそのオフセットのリストを取得するにはどうすればよいですか? また、これらのオフセットをディスク上の共有オブジェクト ファイルに関連付けるにはどうすればよいですか (.so ファイルの bfd を個別にロードできるように)。