リンカーとライブラリ

付録 A リンカーのクイックリファレンス

以降の節には、リンカーで最も一般的に使用するシナリオの概要が記載してあります。これは、実際に操作を行う際の「虎の巻」として利用できます。リンカーによって生成される出力モジュールの種類については、リンク編集 を参照してください。

記載された例には、コンパイラドライバに指定するリンカーのオプションが示されています。リンカーを起動するには、これらのオプションを使用するのが最も一般的です。例の中では、cc(1) を使用しています。コンパイラドライバを使用する を参照してください。

リンカーは、入力ファイルの名前によって動作を変えることはありません。各ファイルは、開かれ、検査が行われて、必要な処理の種類が判別されます。詳細は、入力ファイルの処理を参照してください。

libx.so の命名規約に従って命名された共有オブジェクトと、libx.a の命名規約に従って命名されたアーカイブライブラリは、-l オプションを使用して指定できます。詳細は、ライブラリの命名規約を参照してください。これにより、-L オプションを使用して指定できる検索パスに、より柔軟性を持たせることができます。詳細は、リンカーが検索するディレクトリを参照してください。

リンカーは、基本的には、「静的」または「動的」の 2 つの方法のうちのいずれかで稼動します。

静的方法

静的方法は、-d n オプションが使用された場合に選択されます。また、このモードを使用すると、再配置可能オブジェクトと静的実行プログラムを作成できます。この場合、再配置可能オブジェクトとアーカイブライブラリの入力形式だけが受け入れられます。-l オプションを使用すると、アーカイブライブラリが検索されます。

再配置可能オブジェクトの作成


$ cc -dn -r -o temp.o file1.o file2.o file3.o .....

静的実行プログラムの作成

静的実行プログラムの使用は制限されています。静的実行プログラムには、通常、プラットフォーム固有な実装に依存した情報などが組み込まれ、これにより、他のプラットフォーム上で実行プログラムを実行することが制限されます。多くの Solaris ライブラリの実装は、dlopen(3DL) や 、dlsym(3DL) などの動的リンク機能に依存しています。詳細は、追加オブジェクトの読み込みを参照してください。これらの機能は、静的実行プログラムでは使用できません。


$ cc -dn -o prog file1.o file2.o file3.o .....

-a オプションを使用して、静的実行プログラムの作成を指示できます。-d n を指定して -r を指定しない場合、-a が暗黙のうちに指定されます。

動的方法

これは、リンカーの標準の動作方法です。-d y オプションで明示的に指定することもできますが、-d n オプションを使用しない場合には、暗黙のうちに指定されます。

この場合、再配置可能オブジェクト、共有オブジェクト、およびアーカイブライブラリを指定できます。-l オプションを使用すると、ディレクトリ検索が実行され、ここで、各ディレクトリは、共有オブジェクトを見つけるために検索されます。そのディレクトリで共有オブジェクトが見つからない場合は、次にアーカイブライブラリが検索されます。-B static オプションを使用すると、アーカイブライブラリの検索だけに限定されます。詳細は、共有オブジェクトとアーカイブとの混合体へのリンクを参照してください。

共有オブジェクトの作成

次の例は、説明したオプションを組み合わせたものです。


$ cc -c -o foo.o -Kpic -xregs=no%appl foo.c
$ cc -M mapfile -G -o libfoo.so.1 -z text -z defs -B direct -z lazyload \
-z combreloc -z ignore -R /home/lib foo.o -L. -lbar -lc

次の例は、説明したオプションを組み合わせたものです。


$ cc -M mapfile -G -o libfoo.so.1 -z text -z defs -B direct -z lazyload \
-z combreloc -z ignore -R /home/lib -h libfoo.so.1 foo.o -L. -lbar -lc
$ ln -s libfoo.so.1 libfoo.so

動的実行プログラムの作成

次の例は、説明したオプションを組み合わせたものです。


$ cc -o prog -R /home/lib -z ignore -z lazyload -B direct -L. \
-lfoo file1.o file2.o file3.o .....