4

以下の問題について考えたことはありませんが、コード内の多数の依存関係に対処する必要があるため、事実を明確にしたほうがよいと思いました。これを、ubuntu amd64 などの最新の Linux バージョンに制限しましょう。

静的ライブラリには動的ライブラリ参照が含まれていないため、未定義のシンボルは静的ライブラリでどのように解決されますか? 依存するバイナリは未定義のシンボルを動的にロードできますか、それともコンパイル時に別の静的ライブラリまたはオブジェクト ファイルによってシンボルを解決する必要がありますか?

コンパイラは動的ライブラリにリンクすることで (静的ライブラリに依存するアプリケーションの) 依存関係を解決できますか? その場合、コード テキストは結果のバイナリに静的に解決されるか、または動的参照が存在しますか?

たとえば、静的ライブラリLmallocfromlibc6.soを使用し、それは application によって使用されますA。どちらもlibc6.soLAmalloc を動的に使用しますか?

4

2 に答える 2

7

静的ライブラリは、一緒にアーカイブされたオブジェクト ファイルのリストに他なりません。

静的ライブラリで未定義のシンボルはどのように解決されますか?

未定義のシンボルがないため、解決されません。シンボルはリンケージ段階でのみ未定義と見なされ、静的ライブラリを作成するときにリンケージは行われません。

静的ライブラリに対してバイナリをリンクすると、未定義のシンボルが存在する可能性があります。その場合、スタティック ライブラリはプログラムの一部のように扱われるため、そのスタティック ライブラリで使用されるシンボルへのすべての参照は、ビルドするプログラムのスコープ内で使用できる必要があります。たとえば、プログラムが他のライブラリのシンボルを使用Aするスタティック ライブラリとリンクする場合、プログラムは および とリンクする必要があります。BCDABD

依存するバイナリは、未定義のシンボルを動的にロードできますか

はい、できます。しかし、怠惰で動的な解決が本当に必要でない限り、そのようにするべきではありません。

または、コンパイル時に別のスタティック ライブラリまたはオブジェクト ファイルによってシンボルを解決する必要があります。

オブジェクト ファイルやスタティック ライブラリは、シンボルを解決しません。それを行うのはリンカです。

コンパイラが解決しますように...

コンパイラは依存関係を解決しません。リンカーの仕事です。依存関係は、リンク時、または動的リンカーによる実行時に解決できます。

動的ライブラリにリンクすることによる (静的ライブラリに依存するアプリケーションの) 依存関係、...

リンカーは、使用している静的ライブラリが、リンク先の動的ライブラリにあるシンボルに依存していることを理解できます。

もしそうなら、コードテキストは結果のバイナリに静的に解決されますか、それとも動的参照が存在しますか?

共有ライブラリに対してリンクすると、プログラムで静的に利用できるものは何もありません。それが共有ライブラリのポイントです。例外は LTO のみです。リンクする静的ライブラリに関しては、その静的ライブラリから動的に利用できるものは何もなく、コンパイルされ、使用されていないシンボルは削除されます。

たとえば、静的ライブラリ L は libc6.so の malloc を使用し、アプリケーション A によって使用されます。L と A はどちらも libc6.so の malloc を動的に使用しますか?

malloc()はい、静的ライブラリとコンパイラのコンパイル時にの定義が利用可能であった場合を除き、何らかの理由で の本体をmalloc()静的ライブラリのコードにインライン化しただけです。しかし、malloc()それは起こりません。ただし、他の機能で問題が発生する可能性があります。

于 2012-03-07T17:16:21.307 に答える
1

静的ライブラリ(foo.aファイル)は、実際には、アーカイバであるarがパックされた一連のオブジェクトファイル(xoyo、...)です。

この静的ライブラリは、リンク時に使用され、それ以外の場合は未定義の参照を満たします。リンク時(ここではコンパイル時は重要ではありません)で満たされないものはすべて、ダイナミックライブラリ( bar.soファイル)を介してロード時に満たされる必要があります。

最後の例では、静的ライブラリLとプログラムAを使用して、両方の(A、L)がlibc6.soからの同じmallocを使用します。ただし、プリロード、異なるヘッダーファイルからのインラインmalloc、またはその他のトリックを使用しない限り、 、あなたが言及していないこと。

于 2012-03-07T17:09:02.277 に答える