次のように、ldd を使用して依存関係を判別できます。
sjwang@delpe02-179: ldd `which date`
linux-vdso.so.1 => (0x00007fff0f5fd000)
librt.so.1 => /lib64/librt.so.1 (0x00002b2f7ea50000)
libc.so.6 => /lib64/libc.so.6 (0x00002b2f7ec59000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00002b2f7efb1000)
/lib64/ld-linux-x86-64.so.2 (0x00002b2f7e832000)
"date" は "libc.so" に依存するため、"date" は "libc.so" 内の何らかの関数を呼び出すと想定し、ldd は実行可能ファイルの .dynamic セクションから "date" の lib 依存関係を判断できることを知っていますが、問題は、コンパイラ/リンカーが .dynamic セクションに何を書き込む必要があるかをどのように認識するかです。もう少し詳しく言うと:
"libc.so" が "date" に静的にリンクされている場合、この関数のコードは既に "date" にコンパイルされているはずです。したがって、この場合、"date" は "libc.so" に依存してはならず、 .dynamic セクションの「libc.so」。
「libc.so」が「date」と動的にリンクされている場合、この場合、次のようなコードを想定しています。
ハンドル = dlopen("libc.so", ..);
"libc.so" をロードするには "date" に存在する必要があり、"dlopen("libc.so")" は、"date" が "libc.so" に依存しているという唯一の手がかりになるはずです。リンカーは、「日付」が「libc.so」に依存していることを知っていますか? lib依存関係を抽出するためにすべての「dlopen」行を解析しますか? これは良い方法だとは思いませんが、これは本当でしょうか?
または、コンパイラ/リンカーには、動的リンクの場合にライブラリの依存関係を判断する他の方法がありますか? ありがとう。