2012-02-22 15 views
2

私は静的オブジェクト(libfoo.a)を生成したライブラリfooを持っています。静的オブジェクトから共有オブジェクトへのシンボルのコピー

私はlibfoo.aからいくつかのシンボルを取得する共有オブジェクト(libbar.so)を作成した2番目のライブラリbarを持っています。

私はバーにリンクしようとしている第3のライブラリbazを持っています。リンカーを起動すると、barに欠けているシンボルについてエラーが出ます(fooにあるシンボルに対応)。 nmは、これらのシンボルがlibfoo.aに存在しますが、libbar.soには存在しないことを示しています。しかし、libbar.soにlibfoo.aの記号がいくつかあります。

なぜすべてのシンボルがコピーされないのですか?

答えて

5

.aライブラリは「静的オブジェクト」ではありません。 .aファイルは、理論上はtarと似ていますが、異なるフォーマットであり、arコマンドで生成されたアーカイブです。アーカイブ内の各オブジェクトは個別で個別です。通常、これらのオブジェクトはコンパイルされたリンクされていないオブジェクトである.oファイルです。それらの.oファイルのいずれかに含まれるすべてのシンボルは、リンク中に別のファイルに含まれます(ld)。ただし、リンク中にアーカイブ内のオブジェクトがすべて必要なわけではない場合、他のオブジェクトファイルのシンボルはリンクされたファイルには表示されません。

たとえば、libdialog.aには、mouse.ocolumns.oのオブジェクトファイルがあります。プログラムでは列は使用されますが、マウス機能は使用されません。したがって、プログラムにはすべてのシンボルがcolumns.oに含まれていますが、mouse.oのシンボルは含まれていません。

"共有オブジェクト"(.so)の場合、それは単一のオブジェクトです。そのため、オブジェクトとのリンクには、オブジェクト内のすべてのシンボルが必要かどうかが含まれます。上記の例では、libdialog.soとリンクした場合、マウスベースのコードは使用されていませんが、columns.omouse.oの両方のシンボルがプログラムに含まれます。

共有オブジェクト(.so)を生成する場合、アーカイブ(.a)の使用時に同じリンケージルールが適用されます。したがって、.soファイルには、使用されているアーカイブ内のファイル.oのシンボルのみが含まれます。

+0

ご清聴ありがとうございます。しかし、私のシナリオでは、barは何も使わないので、バーは '.so'に含まれていないシンボルを探しているのはなぜですか? – notlesh

+1

コードを見ることなく、私はそれに答えることができません。リンカ( 'ld')は、解決する必要のあるシンボルを見て、そのシンボルを持つライブラリ(' .a'や '.so')やオブジェクトファイルを探します。次に取るべきことは、 'libbaz.so'(' bas.o'など)に入るオブジェクトファイルで、どのシンボルを解決する必要があるのか​​( 'nm -g')を調べることです。 – Arcege

関連する問題