私は .so ライブラリを構築していますが、疑問に思っていました - b/w -h と -o cc コンパイラ オプション (Sun Studio C++ を使用) の違いは何ですか?
それらは同じもの、つまり出力ファイルの名前を参照していませんか?
-o
コンパイラによってディスクに書き込まれるファイルの名前です
-h
このファイルにリンクする ELF バイナリに記録される名前です。
一般的な用途の 1 つは、ライブラリのマイナー バージョン番号を提供することです。たとえば、共有ライブラリ libfoo を作成している場合は、次のようにします。
cc -o libfoo.so.1.0 -h libfoo.so.1 *.o
ln -s libfoo.so.1.0 libfoo.so.1
ln -s libfoo.so libfoo.so.1
次に、Hello World アプリをコンパイルして、それに対してリンクすると、
cc -o hello -lfoo
hello の elf バイナリはNEEDED
エントリを記録しlibfoo.so.1
ます (実行すると表示されますelfdump -d hello
)。
その後、後で新しい関数を追加する必要がある場合は、-o
値を
変更しlibfoo.so.1.1
て -h をそのままにしておくことができます。1.0 でlibfoo.so.1
既にビルドしたすべてのプログラムlibfoo.so.1
は実行時にロードしようとするため、再ビルドせずに作業を続けますが、 ls で 1.1 であることを確認します。
これは、実行時に使用されるのと同じディレクトリにライブラリをビルドするときにも使用されることがあります。これは、別のインストール ディレクトリがないか、パッケージ システム経由でインストールする場合です。ライブラリ バイナリを上書きするときに実行中のプログラムがクラッシュするのを回避し、ビルドの途中でプログラムが起動できなくなるのを回避するために、一部の Makefile は次のことを行います。
cc -o libfoo.so.1.new -h libfoo.so.1 *.o
rm libfoo.so.1 ; mv libfoo.so.1.new libfoo.so.1
(X の古い Imake makefile ジェネレーターによってビルドされた Makefile は、一般的にこれを行います。)
それらは異なる名前を参照しています。具体的には、-o
オプションはファイルの実際の名前 (ファイルシステム上の名前) です。この-h
オプションは、最終的なオブジェクト ファイルにinternalを設定します。 DT_SONAME
これは、共有オブジェクトが他のモジュールによって内部的に参照される名前です。ldd
リンクしているオブジェクトを実行するときにも表示される名前だと思います。
-o オプションは出力ファイルに名前を付け、 -h オプションはライブラリ内に固有の名前を設定します。この組み込み名は、ダイナミック ローダーによって使用されるときにファイル名よりも優先され、事前定義されたルールを使用して適切なライブラリをピークすることができます。
そのコマンドを使用して、特定のライブラリに記録された組み込み名を確認できます。
elfdump -d xxx.so | SONAME を grep
詳細については、こちらをご覧ください。
http://docs.oracle.com/cd/E23824_01/html/819-0690/chapter4-97194.html