静的ライブラリは再配置可能なオブジェクトファイルを使用し、共有ライブラリはソースファイルを使用するのはなぜですか?

静的ライブラリは再配置可能なオブジェクトファイルを使用し、共有ライブラリはソースファイルを使用するのはなぜですか?

静的ライブラリと共有ライブラリを紹介する教科書を読みました。 2つのソースファイルaddvec.cがあり、multvec.c静的ライブラリを作成するには、次のようにarツールを使用します。

linux> gcc -c addvec.c multvec.c
linux> ar rcs libvector.a addvec.o multvec.o

したがって、デフォルトでは、最初に再配置可能なオブジェクトファイル(.o)を作成し、これらの.oファイルと一緒にarツールを使用します。

ただし、共有ライブラリlibVector.soを構築するには、この本のコマンドは次のとおりです。

linux> gcc -shared -fpic -o libvector.so addvec.c multvec.c

再配置可能なオブジェクトファイルではなく、ソースファイル(.c)をパラメータとして直接使用することに注意してください。

それでは、共有ライブラリの場合、再配置可能なオブジェクトファイルを生成する必要はありませんが、ソースファイルを直接使用する必要がないのはなぜですか?これは、再配置可能オブジェクトファイルを使用した静的リンクと一致しません。

答え1

あなたできる共有ライブラリのコンポーネントオブジェクトを別々に構築します。

gcc -fpic -c addvec.c multvec.c
gcc -shared -fpic -o libvector.so addvec.o multvec.o

ただし、すべてのコンパイルおよび接続フェーズでは同じフラグを使用する必要があります。私はこれがあなたの教科書で使用されているアプローチの主な理由だと思います。静的ライブラリには場所に依存しないコードは必要ありませんが、共有ライブラリには必要です。共有ライブラリは、明示的に各オブジェクトファイルを2回構築するか、静的ライブラリからPICを「無駄にする」のではなく、ソースファイルのPICを使用して構築されます。

関連情報