でトレース/印刷/任意のdlopenの使用状況を記録することができます。
最終的に、ダイナミックリンカそのものの内部状態を傷つけることなくこれを行う方法はありませんでした。情報を持っているが、それを解釈するためにプライベートGlibcヘッダを使用しなければならないことがld.so
からエクスポートされた_rtld_global
シンボルがあることがわかりました。
以下はPythonスニペットです(私のGlibcソースの読者が正しいと仮定します)、グローバルネームスペース内のすべての共有ライブラリを検索順に表示します。 RTLD_LOCAL
がロードされたライブラリは印刷されません。
Glibcの実装の詳細に依存しているという事実は、このアプローチが危険に苦しんでいることを意味しますが、テスト/監査の目的ではうまくいくと思います。私のCentOSの7のシステムで
import ctypes
# Abridged type declarations pillaged from Glibc. See:
# - https://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/generic/ldsodefs.h
# - https://sourceware.org/git/?p=glibc.git;a=blob;f=include/link.h
class link_map(ctypes.Structure):
_fields_ = [
("l_addr", ctypes.c_size_t),
("l_name", ctypes.c_char_p),
]
class r_scope_elem(ctypes.Structure):
_fields_ = [
("r_list", ctypes.POINTER(ctypes.POINTER(link_map))),
("r_nlist", ctypes.c_uint),
]
class rtld_global(ctypes.Structure):
_fields_ = [
("_ns_loaded", ctypes.POINTER(link_map)),
("_ns_nloaded", ctypes.c_uint),
("_ns_main_searchlist", ctypes.POINTER(r_scope_elem)),
]
_rtld_global = rtld_global.in_dll(ctypes.CDLL(None), "_rtld_global")
searchlist = _rtld_global._ns_main_searchlist[0]
print [searchlist.r_list[n][0].l_name for n in xrange(searchlist.r_nlist)]
、これは印刷します
['', '/lib64/libpython2.7.so.1.0', '/lib64/libpthread.so.0', '/lib64/libdl.so.2',
'/lib64/libutil.so.1', '/lib64/libm.so.6', '/lib64/libc.so.6',
'/lib64/ld-linux-x86-64.so.2']
をさて、あなたは(あなたがリストを持っている場合)、ライブラリがすでにRTLD_NOLOADでdlopenの例に使用してロードされている場合は、それがnullを返します確認することができます既にロードされているかどうかに応じて、ハンドルまたはハンドルを作成します。おそらくあなたを助けるかもしれない何かは、/ proc/PID /マップ解析/分析でしょう。それはあなたを助けるかもしれません[リンク](https://stackoverflow.com/questions/5103443/how-to-check-what-shared-libraries-are-loaded-at-run-time-for-a-given-process ) –