共有ライブラリーの作成
このセクションでは共有ライブラリーの作成方法について説明します。
前提となる作業
- 共有ライブラリーを作成するときにコンパイルしリンク
すべきソース・ファイル (1 つまたは複数) を作成します。 これらのファイルには、
他のソース・ファイルで参照されるエクスポート・シンボルが入っています。
ここの例では、share1.c と share2.c の 2 つの ソース・ファイルが使用されます。 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 ファイルには、次のコードが入っています。
#! 行が意味を持つのは、ファイルがインポート・ファイル として使用される場合に限られます。 この場合、#! 行は、 実行時に使用する共有ライブラリー・ファイルの名前を識別します。#! /home/sharelib/shrsub.o * Above is full pathname to shared library object file func1 func2 func3
手順
- 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 を、 再入可能な共有ライブラリーとマークする。
共有コードを使用する各プロセスは、 その私用プロセス域のデータの私用コピーを入手します。
- フラグ
- ダミーのエントリー・ポイント _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 ディレクトリーには、 共有ライブラリーが入っていて、 通常はライブラリー検索パスに組み込まれている必要があります。