2

次のように、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 セクションに何を書き込む必要があるかをどのように認識するかです。もう少し詳しく言うと:

  1. "libc.so" が "date" に静的にリンクされている場合、この関数のコードは既に "date" にコンパイルされているはずです。したがって、この場合、"date" は "libc.so" に依存してはならず、 .dynamic セクションの「libc.so」。

  2. 「libc.so」が「date」と動的にリンクされている場合、この場合、次のようなコードを想定しています。

ハンドル = dlopen("libc.so", ..);

"libc.so" をロードするには "date" に存在する必要があり、"dlopen("libc.so")" は、"date" が "libc.so" に依存しているという唯一の手がかりになるはずです。リンカーは、「日付」が「libc.so」に依存していることを知っていますか? lib依存関係を抽出するためにすべての「dlopen」行を解析しますか? これは良い方法だとは思いませんが、これは本当でしょうか?

または、コンパイラ/リンカーには、動的リンクの場合にライブラリの依存関係を判断する他の方法がありますか? ありがとう。

4

2 に答える 2

2

コンパイラ/リンカーは、.dynamic セクションに何を書き込むべきかをどのように認識していますか?

  • .dynamicコンパイラはセクションについて何も知りません
  • リンカは、あなたが とリンクしているかとリンクしているかを知っています。[1] をリンクしている場合は、セクションにエントリを書き込みます。libc.alibc.so*.soDT_NEEDED.dynamic

次のようなコードがあるとします。handle = dlopen("libc.so", ..);

それはあなたの誤った仮定と誤解です。を使用すると、直接dlopen依存しない(存在する場合も存在しない場合もある) ライブラリを使用できます。直接依存しているライブラリ ( など):libc.so

  • dlopen する必要はありません (ローダーは、プログラムが開始する前にそれらを既にマップしています)。
  • オプションではありません (欠落している場合、ローダーは激しく失敗します)。

[1] リンカーフラグ--as-neededは、そのステートメントを部分的にのみ真にします。

于 2013-01-04T19:04:30.987 に答える
0

.soファイルには、セクションだけでなく多くのものがあり.dynamicます。実行可能およびリンク可能形式の詳細をお読みください(ELFは.soファイルおよびバイナリ実行可能ファイルの形式です)。

特にELFファイルにはヘッダーがあり、これらには情報が含まれています。objdumpおよび/または readelfユーティリティを使用してそれらを探索します。

共有ライブラリを構築するときは、他のライブラリとリンクできることを忘れないでください。

于 2013-01-04T09:29:02.763 に答える