共有ライブラリーの作成

このセクションでは共有ライブラリーの作成方法について説明します。

前提となる作業

  1. 共有ライブラリーを作成するときにコンパイルしリンク すべきソース・ファイル (1 つまたは複数) を作成します。 これらのファイルには、 他のソース・ファイルで参照されるエクスポート・シンボルが入っています。

    ここの例では、share1.cshare2.c の 2 つの ソース・ファイルが使用されます。 share1.c  ファイルには、次のコードが入っています。

    
    /************
     * share1.c: shared library source.
    *************/
    
    #include <stdio.h>
    
    void func1 ()
     {
       printf("func1 called¥n");
     }
    
    void func2 ()
     {
       printf("func2 called¥n");
     }
    share2.c ファイルには、次のコードが入っています。
    /************
     * share2.c: shared library source.
    *************/
    
    void func3 ()
     {
       printf("func3 called¥n");
     }
    これらのファイルのエクスポート・シンボルは、 func1func2、 および func3 です。
  2. 共有ライブラリーに入るエクスポート・シンボルを参照する メイン・ソース・ファイルを作成します。

    この節の例では、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 ();
     }
  3. 他のオブジェクト・モジュールが参照する共有ライブラリー内の シンボルを明示的にエクスポートする際に必要な、エクスポート・ファイルを作成します。

    この節の例では、shrsub.exp という名前の エクスポート・ファイルが使用されます。 shrsub.exp ファイルには、次のコードが入っています。

    
    #! /home/sharelib/shrsub.o 
    * Above is full pathname to shared library object file
    func1
    func2
    func3
    #! 行が意味を持つのは、ファイルがインポート・ファイル として使用される場合に限られます。 この場合、#! 行は、 実行時に使用する共有ライブラリー・ファイルの名前を識別します。

手順

  1. 2 つのソース・コード・ファイルをコンパイルし、リンクして共有できるようにします。 (この手順では、/home/sharedlib ディレクトリー内に いることを前提としています。) ソース・ファイルをコンパイルし、リンクするには、以下のコマンドを入力します。
    cc -c share1.c
    cc -c share2.c
    cc -o shrsub.o share1.o share2.o -bE:shrsub.exp -bM:SRE -bnoentry
    これによって、shrsub.o という名前の共有ライブラリー を /home/sharedlib ディレクトリー内に作成します。
    -bM:SRE フラグ
    作成されたオブジェクト・ファイル shrsub.o を、 再入可能な共有ライブラリーとマークする。

    共有コードを使用する各プロセスは、 その私用プロセス域のデータの私用コピーを入手します。

    フラグ
    ダミーのエントリー・ポイント _nostart を設定して、 デフォルトのエントリー・ポイント _start を指定変更する。
    -bnoentry フラグ
    共有ライブラリーにエントリー・ポイントがないことを、 リンケージ・エディターに知らせる。

    共有ライブラリーにエントリー・ポイントがある場合でも、 システム・ローダーは、共有ライブラリーのロード時にエントリー・ポイントを使用しません。

  2. 次のコマンドを用いて、 共有ライブラリーをアーカイブ・ファイルに入れます。
    ar qv libsub.a shrsub.o
    このステップはオプショナルです。 -l および -L フラグ は ld コマンドとともに使用できるため、共有ライブラリーを アーカイブに入れると、プログラムをリンクする際の共有ライブラリーの指定が容易になります。
  3. 共有ライブラリーでメイン・ソース・コードをコンパイルし、リンクし て、実行可能ファイルを作成します。 (このステップでは、現在の作業ディレクトリーに main.c ファイルが入って いることが前提です。) 次のコマンドを使用します。
    cc -o main main.c -lsub -L/home/sharedlib
    共有ライブラリーがアーカイブにない場合は、次のコマンドを使用します。
    cc -o main main.c /home/sharedlib/shrsub.o -L/home/sharedlib
    プログラム main は、これで実行可能です。 func1func2、 および func3 シンボルは、 ロード時据え置き解決用にマークされています。 実行時に、システム・ローダーはモジュールを共有ライブラリーにロードし (モジュールが ロード済みでない限り)、参照を動的に解決します。
注: C++ オブジェクトから共有ライブラリーを作成するときは、 エクスポート・ファイル内のマングル C++ シンボル名を使用する必要があります。 ただし、ご使用の C++ コンパイラーが、共有ライブラリーを作成するオプションを提供している 場合があります。 詳しくは、ご使用のコンパイラーの資料を参照してください。
-L フラグ
指定されたディレクトリー (この場合は /home/sharedlib) を、 プログラムのローダー・セクションに保存されるライブラリー検索パスに追加する。

実行時に、ライブラリー検索パスを用いて、ローダーに共有ライブラリーの 検出場所を知らせます。

LIBPATH 環境変数
異なるライブラリー検索パスの指定にも使用できるディレクトリー・パスの、 コロンで区切ったリスト。 そのフォーマットは、 PATH 環境変数のフォーマットと同じです。

リスト内のディレクトリーは、 共有オブジェクトへの参照を解決するときに検索されます。 /usr/lib および /lib ディレクトリーには、 共有ライブラリーが入っていて、 通常はライブラリー検索パスに組み込まれている必要があります。