共有ライブラリーの作成
このセクションでは共有ライブラリーの作成方法について説明します。
前提となる作業
- 共有ライブラリーを作成するときにコンパイルしリンク
すべきソース・ファイル (1 つまたは複数) を作成します。 これらのファイルには、
他のソース・ファイルで参照されるエクスポート・シンボルが入っています。
この記事の例では、2 つのソース・ファイルがshare1.cおよびshare2.c, が使用されます。 このshare1.c ファイルには以下のコードが含まれます。
このshare2.cファイルには以下のコードが含まれます。/************ * share1.c: shared library source. *************/ #include <stdio.h> void func1 () { printf("func1 called\n"); } void func2 () { printf("func2 called\n"); }
これらのファイルにエクスポートされるシンボルは、次のとおりです。func1,func2およびfunc3./************ * share2.c: shared library source. *************/ void func3 () { printf("func3 called\n"); } - 共有ライブラリーに入るエクスポート・シンボルを参照する
メイン・ソース・ファイルを作成します。
この記事の例では、以下の名前のメイン・ソース・ファイルを使用します。main.c使用されます。 このmain.c ファイルには以下のコードが含まれます。
/************ * main.c: contains references to symbols defined * in share1.c and share2.c *************/ #include <stdio.h> extern void func1 (), func2 (), func3 (); main () { func1 (); func2 (); func3 (); } - 他のオブジェクト・モジュールが参照する共有ライブラリー内の
シンボルを明示的にエクスポートする際に必要な、エクスポート・ファイルを作成します。
この記事の例では、以下の名前のエクスポート・ファイルを使用します。shrsub.exp使用されます。 このshrsub.exp ファイルには以下のコードが含まれます。
この#!行が意味を持つのは、ファイルがインポート・ファイル として使用される場合に限られます。 In this case, the#!line は、実行時に使用される共用ライブラリー・ファイルの名前を識別します。#! /home/sharelib/shrsub.o * Above is full pathname to shared library object file func1 func2 func3
PROCEDURE
- 2 つのソース・コード・ファイルをコンパイルし、リンクして共有できるようにします。 (この手順では、/home/sharedlib ディレクトリー内に
いることを前提としています。) ソース・ファイルをコンパイルし、リンクするには、以下のコマンドを入力します。
これにより、共有ライブラリー名が作成されますshrsub.o/home/sharedlib ディレクトリーにあります。cc -c share1.c cc -c share2.c cc -o shrsub.o share1.o share2.o -bE:shrsub.exp -bM:SRE -bnoentry- -bM:SRE フラグ
- 結果のオブジェクト・ファイルにマークを付けます。shrsub.o再入可能な共有ライブラリーとして
共有コードを使用する各プロセスは、 その私用プロセス域のデータの私用コピーを入手します。
- flag
- ダミー・エントリー・ポイントを設定します。_nostartデフォルトのエントリー・ポイントをオーバーライドします。_start
- -bnoentry フラグ
- 共有ライブラリーにエントリー・ポイントがないことを、 リンケージ・エディターに知らせる。
共有ライブラリーにエントリー・ポイントがある場合でも、 システム・ローダーは、共有ライブラリーのロード時にエントリー・ポイントを使用しません。
- 次のコマンドを用いて、
共有ライブラリーをアーカイブ・ファイルに入れます。
このステップはオプショナルです。 -l および -L フラグ は ld コマンドとともに使用できるため、共有ライブラリーを アーカイブに入れると、プログラムをリンクする際の共有ライブラリーの指定が容易になります。ar qv libsub.a shrsub.o - 共有ライブラリーでメイン・ソース・コードをコンパイルし、リンクし
て、実行可能ファイルを作成します。 (このステップでは、現在の作業ディレクトリーに main.c ファイルが入って
いることが前提です。) 次のコマンドを使用します。
共有ライブラリーがアーカイブにない場合は、次のコマンドを使用します。cc -o main main.c -lsub -L/home/sharedlib
プログラムmainは現在実行可能です。 このfunc1,func2およびfunc3シンボルには、ロード時据え置き解決のマークが付けられています。 実行時に、システム・ローダーはモジュールを共有ライブラリーにロードし (モジュールが ロード済みでない限り)、参照を動的に解決します。cc -o main main.c /home/sharedlib/shrsub.o -L/home/sharedlib
注: C++ オブジェクトから共有ライブラリーを作成する場合は、エクスポート・ファイルでマングルされた C++ シンボル名を使用する必要があります。 ただし、ご使用の C++ コンパイラーが、共有ライブラリーを作成するオプションを提供している
場合があります。 詳しくは、ご使用のコンパイラーの資料を参照してください。
- -L フラグ
- 指定されたディレクトリーを追加します (この場合は、/home/sharedlib) プログラムのローダー・セクションに保存されているライブラリー検索パスに移動します。
実行時に、ライブラリー検索パスを用いて、ローダーに共有ライブラリーの 検出場所を知らせます。
- LIBPATH 環境変数
- 異なるライブラリー検索パスの指定にも使用できるディレクトリー・パスの、 コロンで区切ったリスト。 そのフォーマットは、 PATH 環境変数のフォーマットと同じです。
リスト内のディレクトリーは、 共有オブジェクトへの参照を解決するときに検索されます。 /usr/lib および /lib ディレクトリーには、 共有ライブラリーが入っていて、 通常はライブラリー検索パスに組み込まれている必要があります。