共有ライブラリーの作成

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

前提となる作業

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

    この記事の例では、2 つのソース・ファイルがshare1.cおよびshare2.c, が使用されます。 この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");
     }
    これらのファイルにエクスポートされるシンボルは、次のとおりです。func1,func2および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
    この#!行が意味を持つのは、ファイルがインポート・ファイル として使用される場合に限られます。 In this case, the#!line は、実行時に使用される共用ライブラリー・ファイルの名前を識別します。

PROCEDURE

  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再入可能な共有ライブラリーとして

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

    flag
    ダミー・エントリー・ポイントを設定します。_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は現在実行可能です。 このfunc1,func2およびfunc3シンボルには、ロード時据え置き解決のマークが付けられています。 実行時に、システム・ローダーはモジュールを共有ライブラリーにロードし (モジュールが ロード済みでない限り)、参照を動的に解決します。
注: C++ オブジェクトから共有ライブラリーを作成する場合は、エクスポート・ファイルでマングルされた C++ シンボル名を使用する必要があります。 ただし、ご使用の C++ コンパイラーが、共有ライブラリーを作成するオプションを提供している 場合があります。 詳しくは、ご使用のコンパイラーの資料を参照してください。
-L フラグ
指定されたディレクトリーを追加します (この場合は、/home/sharedlib) プログラムのローダー・セクションに保存されているライブラリー検索パスに移動します。

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

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

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