静的ライブラリは、一緒にアーカイブされたオブジェクト ファイルのリストに他なりません。
静的ライブラリで未定義のシンボルはどのように解決されますか?
未定義のシンボルがないため、解決されません。シンボルはリンケージ段階でのみ未定義と見なされ、静的ライブラリを作成するときにリンケージは行われません。
静的ライブラリに対してバイナリをリンクすると、未定義のシンボルが存在する可能性があります。その場合、スタティック ライブラリはプログラムの一部のように扱われるため、そのスタティック ライブラリで使用されるシンボルへのすべての参照は、ビルドするプログラムのスコープ内で使用できる必要があります。たとえば、プログラムが他のライブラリのシンボルを使用A
するスタティック ライブラリとリンクする場合、プログラムは および とリンクする必要があります。B
C
D
A
B
D
依存するバイナリは、未定義のシンボルを動的にロードできますか
はい、できます。しかし、怠惰で動的な解決が本当に必要でない限り、そのようにするべきではありません。
または、コンパイル時に別のスタティック ライブラリまたはオブジェクト ファイルによってシンボルを解決する必要があります。
オブジェクト ファイルやスタティック ライブラリは、シンボルを解決しません。それを行うのはリンカです。
コンパイラが解決しますように...
コンパイラは依存関係を解決しません。リンカーの仕事です。依存関係は、リンク時、または動的リンカーによる実行時に解決できます。
動的ライブラリにリンクすることによる (静的ライブラリに依存するアプリケーションの) 依存関係、...
リンカーは、使用している静的ライブラリが、リンク先の動的ライブラリにあるシンボルに依存していることを理解できます。
もしそうなら、コードテキストは結果のバイナリに静的に解決されますか、それとも動的参照が存在しますか?
共有ライブラリに対してリンクすると、プログラムで静的に利用できるものは何もありません。それが共有ライブラリのポイントです。例外は LTO のみです。リンクする静的ライブラリに関しては、その静的ライブラリから動的に利用できるものは何もなく、コンパイルされ、使用されていないシンボルは削除されます。
たとえば、静的ライブラリ L は libc6.so の malloc を使用し、アプリケーション A によって使用されます。L と A はどちらも libc6.so の malloc を動的に使用しますか?
malloc()
はい、静的ライブラリとコンパイラのコンパイル時にの定義が利用可能であった場合を除き、何らかの理由で の本体をmalloc()
静的ライブラリのコードにインライン化しただけです。しかし、malloc()
それは起こりません。ただし、他の機能で問題が発生する可能性があります。