Fortran プログラミングガイド ホーム目次前ページへ次ページへ索引


第 4 章

ライブラリ

この章では、副プログラムのライブラリを使用する方法と作成する方法を説明します。静的ライブラリと動的ライブラリの両方を説明します。

ライブラリについて

ソフトウェアライブラリとは、通常、すでにコンパイルされ、1 つのバイナリライブラリファイルにまとめられた副プログラムの集合のことです。この集合の個々のメンバーは、ライブラリの要素またはモジュールと呼ばれています。リンカーはライブラリファイルを検索し、ユーザーのプログラムによって参照されるオブジェクトモジュールを読み込み、実行可能バイナリプログラムを構築します。詳細は、ld(1) のマニュアルページと Solaris の『リンカーとライブラリ』を参照してください。

基本的にソフトウェアライブラリには、次の 2 種類があります。

静的 (.a) バージョンと動的 (.so) バージョンの両方をもつ一般的なシステムライブラリを次に示します。

ライブラリを使用すると、次の 2 つの利点があります。

プログラムでライブラリファイルを使用すると、一般的に使用されるサブルーチンをより簡単に共有できるようになります。プログラムのリンク時にライブラリに名前を指定するだけで、プログラム内のリファレンスを解釈処理するこれらのライブラリモジュールがリンクされて、実行可能ファイルにマージされます。

リンカーのデバッグオプションの指定

ライブラリの使用と読み込みに関する要約情報を得るには、LD_OPTIONS 環境変数を介してリンカーに追加オプションを渡します。コンパイラは、オブジェクトのバイナリファイルを生成するときに、これらのオプション (およびその他の必要なオプション) を使用してリンカーを呼び出します。

直接リンカーを呼び出すより、コンパイラを使用することをお勧めします。多くのコンパイラオプションが特定のリンカーオプションまたはライブラリリファレンスを必要としており、これらのオプションやリファレンスなしでリンクすると予期せぬ結果を招くおそれがあるからです。

例: LD_OPTIONS 環境変数を使用してロードマップを作成する場合

demo% setenv LD_OPTIONS '-m -Dfiles'
demo% f77 -o myprog myprog.f

リンカーのオプションには、コンパイラのコマンド行と同じものがあり、f77f95 コマンド上に直接指定できます。 これらのオプションは、-Bx、-dx、-G、-hname
-R
path、および -ztext です。詳細については、f77(1)f95(1) のマニュアルページまたは『Fortran ユーザーズガイド』を参照してください。

リンカーのオプションと環境変数の例と説明は、Solaris の『リンカーとライブラリ』を参照してください。

ロードマップを作成する

リンカーの -m オプションは、ライブラリのリンク情報を表示するロードマップを生成します。実行可能バイナリプログラムの構築中にリンクされるルーチンが、そのルーチンが取り出されたライブラリと共にリストされます。

例 : ロードマップ用の -m

demo% setenv LD_OPTIONS '-m'
demo% f77 any.f
any.f:
 MAIN:
            リンクエディターメモリーマップ

 
出力       入力       仮想
セクション   セクション  アドレス         サイズ

 
.interp            100d4          11
            .interp 100d4          11 (なし)
.hash              100e8          2e8
            .hash    100e8         2e8 (なし)
.dynsym            103d0          650
            .dynsym 103d0          650 (なし)
.dynstr            10a20          366
            .dynstr 10a20          366 (なし)
.text              10c90          1e70 
.text              10c90    00 /opt/SUNWspro/lib/crti.o
.text              10c90    f4 /opt/SUNWspro/lib/crt1.o
.text              10d84    00 /opt/SUNWspro/lib/values-xi.o
.text              10d88    d20 sparse.o
...

他の情報をリストする

他にもリンカーのデバッグ機能があり、リンカーの -Dkeyword オプションで利用できます。完全なリストを表示するには、-Dhelp を使用します。

例 : -Dhelp オプションを使用して、リンカーのデバッグ支援オプションをリストします。

demo% ld -Dhelp
    ...
デバッグ: args     入力引数の処理を表示します (ld のみ)。
デバッグ: basic  基本のトレース情報/警告を提供します。
デバッグ: bindings シンボルバインディングを表示します;詳細フラグで
         絶対アドレス:相対アドレス表示を指定します (ld.so.1 のみ)
デバッグ: detail   他のオプションと共に使用して詳しい情報を提供します。 
デバッグ: entry    エントランス条件の記述子 (ld のみ) を表示します。
    ...
demo%

たとえば、-Dfiles リンカーオプションは、リンクの処理中に参照されるすべてのファイルとライブラリをリストします。

demo% setenv LD_OPTIONS '-Dfiles'
demo% f77 direct.f
direct.f:
 MAIN direct:
デバッグ: ファイル=/opt/SUNWspro/lib/crti.o  [ ET_REL ]
デバッグ: ファイル=/opt/SUNWspro/lib/crt1.o  [ ET_REL ]
デバッグ: ファイル=/opt/SUNWspro/lib/values-xi.o  [ ET_REL ]
デバッグ: ファイル=direct.o  [ ET_REL ]
デバッグ: ファイル=/opt/SUNWspro/lib/libM77.a  [ アーカイブ ] 
デバッグ: ファイル=/opt/SUNWspro/lib/libF77.so  [ ET_DYN ]
デバッグ: ファイル=/opt/SUNWspro/lib/libsunmath.a  [ アーカイブ ] 
      ...

他のリンカーオプションに関する詳細は、『リンカーとライブラリ』を参照してください。

整合性のあるコンパイルとリンク

コンパイルとリンクを別のステップで行う場合は、整合性のあるコンパイルとリンクのオプションを選択することが重要です。次のいずれかのオプションでプログラムの一部をコンパイルする場合は、同じオプションでリンクしてください。

-a, -autopar, -Bx, -fast, -G, -Lpath, -lname, -mt, -xmemalign, -nolib, -norunpath, -p, -pg, -xlibmopt, -xlic_lib=name, -xprofile=p

例 : sbr.f-a でコンパイルし、smain.f-a なしでコンパイルし、それから別のステップでリンクします (-atcov 旧スタイルのプロファイリングを呼び出します)。

 demo% f77 -c -a sbr.f       
 demo% f77 -c smain.f
 demo% f77 -a sbr.o smain.o   {リンクステップ -a をリンカーに渡す。}

さらに、いくつかのオプションでは、すべてのソースファイルをそのオプションでコンパイルする必要があります。オプションは次のとおりです。

-aligncommon, -autopar, -dx, -dalign, -dbl, -explicitpar, -f, -misalign, -native, -parallel, -pentium, -xarch=a, -xcache=c, -xchip=c, -xF, -xtarget=t, -ztext

すべてのコンパイラオプションについての詳細は、f77(1)f95(1) のマニュアルページおよび『Fortran ユーザーズガイド』を参照してください。

ライブラリ検索のパスと順番の設定

リンカーは、いくつかの場所で、指定された順番でライブラリを検索します。検索の対象となるのは、標準のパス、コンパイラオプション -Rpath-llibrary-Ldir で指定された場所、環境変数 LD_LIBRARY_PATH で設定されている場所です。

標準ライブラリパスの検索順序

リンカーによって使用される標準ライブラリ検索パスはインストールパスによって決定されます。さらに、静的な読み込みと動的な読み込みとでは異なります。<インストールポイント> には、Fortran コンパイラがインストールされているパスを指定します。ソフトウェアの標準インストールでは、/opt を指定します。

静的リンク

静的リンカーは、実行可能ファイルの構築中に、次のパス (他にもあります) で、指定された順序で、ライブラリを検索します。

<インストールポイント>/SUNWspro/lib サンの共有ライブラリ
/usr/ccs/lib/
SVr4 ソフトウェアの標準の場所
/usr/lib
UNIX ソフトウェアの標準の場所


上記パスは、リンカーによって使用されるデフォルトのパスです。

動的リンク

動的リンカーは、実行時に、指定された順序で、共有ライブラリを検索します。

検索パスは、実行可能ファイルに組み込まれます。

LD_LIBRARY_PATH 環境変数

LD_LIBRARY_PATH 環境変数を使用して、-llibrary オプションで指定したライブラリをリンカーが検索すべきディレクトリパスを指定します。

複数のディレクトリはコロンで区切って指定できます。通常、LD_LIBRARY_PATH 変数は、コロンで区切ったディレクトリのリストを、次のようにセミコロンで区切って 2 つ持ちます。

dirlist1;dirlist2

最初に、dirlist1 のディレクトリが検索され、次に、コマンド行上で明示的に指定された -Ldir ディレクトリが検索され、最後に、dirlist2 と標準ディレクトリが検索されます。

つまり、次のように、複数の -L でコンパイラが呼び出された場合

f77 ... -Lpath1 ... -Lpathn ...

検索順序は次のようになります。

dirlist1 path1 ... pathn dirlist2 standard_paths

LD_LIBRARY_PATH 変数に、コロンで区切ったディレクトリリストが 1 つだけ含まれる場合、そのリストは dirlist2 として解釈されます。

Solaris オペレーティング環境では、64 ビットの依存関係を検索するときに、類似の環境変数 LD_LIBRARY_PATH_64 を使用して LD_LIBRARY_PATH を無効にできます。詳細については、Solaris の『リンカーとライブラリ』および ld(1) マニュアルページを参照してください。

ライブラリ検索のパスと順序 - 静的リンク

-llibrary コンパイラオプションを使用して、リンカーが外部参照を解決するときに検索する追加のライブラリを指定します。たとえば、オプション -lmylib は、ライブラリ libmylib.solibmylib.a を検索リストに追加します。

リンカーは標準ディレクトリパスを探して、追加の libmylib ライブラリを見つけます。-L オプション (および、LD_LIBRARY_PATH 環境変数) は、標準パス以外でライブラリを探す場所をリンカーに伝えるパスのリストを作成します。

libmylib.a がディレクトリ /home/proj/libs にある場合、オプション
-L/home/proj/libs は、実行可能ファイルを構築するときに探すべき場所をリンカーに伝えます。

demo% f77 -o pgram part1.o part2.o -L/home/proj/libs -lmylib

-llibrary オプションのコマンド行順序

特定の参照が解決されていない場合、ライブラリは 1 度だけ検索され、さらに、検索中のその時点で未定義のシンボルだけが検索されます。コマンド行上に複数のライブラリをリストする場合、これらのライブラリは、コマンド行に指定された順序で検索されます。-llibrary オプションは、次のように配置します。

-Ldir オプションのコマンド行順序

-Ldir オプションは、dir ディレクトリパスをライブラリ検索リストに追加します。リンカーは、まず、-L オプションで指定されたディレクトリでライブラリを検索し、次に、標準ディレクトリで検索します。このオプションは、適用する -llibrary オプションより前に配置された場合だけ有効です。

ライブラリ検索のパスと順序 - 動的リンク

動的ライブラリで、ライブラリ検索のパスと読み込みの順序の変更は、静的リンクのときとは異なります。実際のリンクは、構築時ではなく、実行時に行われます。

構築時に動的ライブラリを指定する

実行ファイルを構築するとき、リンカーは共有ライブラリへのパスを実行可能ファイル自身に記録します。これらの検索パスは、-Rpath オプションで指定できます。 対照的に、-Ldir オプションは、構築時に -llibrary オプションで指定されたライブラリを見つける場所を示しますが、このパスをバイナリ実行可能ファイルに記録しません。

実行可能ファイルが作成されたときに構築されるディレクトリパスは、dump コマンドを使用して表示できます。

例 : a.out に構築されたディレクトリパスをリストします。

demo% f77 program.f -R/home/proj/libs -L/home/proj/libs -lmylibs
demo% dump -Lv a.out | grep RPATH   
[5]      RPATH    /home/proj/libs:/opt/SUNWspro/lib

実行時に動的ライブラリを指定する

実行時、リンカーは、実行可能ファイルに必要な動的リンクを探す場所を次から決定します。

すでに説明したように、LD_LIBRARY_PATH の使用は予想できない副作用があるので、お勧めできません。

動的リンク中のエラーの修正

必要なライブラリを見つけることができなかったとき、動的リンカーは次のようなエラーメッセージを発行します。

 ld.so: prog: fatal: libmylib.so: can't open file: 

メッセージは、そこにあるべきライブラリが存在しなかったことを示しています。実行可能ファイルを構築したときには共有ライブラリのパスを指定したが、その後でライブラリが移動された可能性があります。たとえば、/my/lib/ 中のユーザー独自の動的ライブラリを使用して a.out を構築し、その後でライブラリを他のディレクトリに移動した場合などです。

ldd を使用して、実行可能ファイルがライブラリを検索する場所を検出します。

demo% ldd a.out
    libsolib.so => /export/home/proj/libsolib.so
    libF77.so.4 => /opt/SUNWspro/lib/libF77.so.4
    libc.so.1 => /usr/lib/libc.so.1
    libdl.so.1 => /usr/lib/libdl.so.1

可能であれば、適切なディレクトリにライブラリを移動またはコピーするか、リンカーが検索するディレクトリ中にそのディレクトリへのソフトリンクを作成します (ln -s を使用します)。または、 LD_LIBRARY_PATH が正しく設定されていない可能性があります。LD_LIBRARY_PATH が実行時に必要なライブラリへのパスを実行時に含んでいるか検査します。

静的ライブラリを作成する

静的ライブラリファイルは、ar(1) ユーティリティを使用して、すでにコンパイルされたオブジェクトファイル (.o ファイル) から構築します。

リンカーは、リンクするプログラム中で参照される入口を持つ要素をライブラリから抽出します。たとえば、副プログラム、入口名、初期値設定副プログラム中で初期化される共通ブロックなどです。これらの抽出された要素 (ルーチン) は、リンカーによって生成される a.out 実行可能ファイルに恒久的にリンクされます。

静的ライブラリの長所と短所

静的ライブラリとリンクには、動的なライブラリとリンクと比較した場合、主に 3 つの問題に注意しなければなりません。

a.out 実行可能ファイルを静的にリンクすると、必要なライブラリルーチンは実行可能バイナリファイルの一部となります。しかし、a.out 実行可能ファイルにリンクされた静的ライブラリルーチンを更新する必要が出てきた場合、a.out ファイル全体をリンクし、生成し直さなければ、更新されたライブラリを利用することができません。動的ライブラリを使用すれば、ライブラリは a.out ファイルの一部とはならず、リンクは実行時に行われます。更新された動的ライブラリを利用するために必要なことは、新しいライブラリをシステムにインストールするだけです。

1 つのコンパイル単位 (ソースファイル) には複数の副プログラムが含まれている場合があるので、いっしょにコンパイルすると、これらのルーチンは静的ライブラリ中の 1 つのモジュールとなります。つまり、コンパイル単位中のすべてのルーチンがいっしょに a.out 実行可能ファイルに読み込まれるが、実際に呼び出されるのはこれら副プログラムの 1 つだけであるということを意味します。この状況は、複数のライブラリルーチンを複数のコンパイル可能ソースファイルに分散するという最適化によって改良できます。(ただし、プログラムによって実際に参照されるライブラリモジュールだけが実行可能ファイルに読み込まれます。)

リンカーは、コマンド行に現れる順番、すなわち左から右に入力ファイルを処理します。リンカーがライブラリの要素を読み込むべきかどうかは、すでに処理されたライブラリの要素によって決定されます。この順番は、要素がライブラリファイル中で現れる順番に依存するだけでなく、コンパイルコマンド行上で指定されたライブラリの順番にも依存します。

例 : Fortran プログラムが main.fcrunch.f の 2 つのファイルに記述され、
crunch.f だけがライブラリにアクセスする場合、crunch.f または crunch.o より前に Sun Performance Library のライブラリを参照するとエラーになります。

demo% f77 main.f -lmylibrary crunch.f -o myprog         (誤)
demo% f77 main.f crunch.f -lmylibrary -o myprog         (正)

簡単な静的ライブラリを作成する

1 つのプログラムのルーチンすべてがいくつかのソースファイルのグループに分散されており、また、これらのソースファイルすべてがサブディレクトリ test_lib/ にあるものと仮定します。

さらに、それぞれのファイルがユーザーのプログラムによって呼び出される 1 つの副プログラムと、その副プログラムからは呼び出されるがライブラリ中の他のルーチンからは呼び出されない「ヘルパー」ルーチンをもつように、ファイルを編成すると仮定します。また、複数のライブラリルーチンから呼び出されるヘルパールーチンはすべて 1 つのソースファイルにまとめられているとします。これによって、合理的に上手に編成されたソースファイルとオブジェクトファイルのセットができます。

各ソースファイルの名前は、そのファイルの中の最初のルーチンの名前から決定すると仮定します。ほとんどの場合、それはライブラリ中の主要なファイルです。

demo% cd test_lib
demo% ls
total 14          2 dropx.f      2 evalx.f      2 markx.f
   2 delte.f      2 etc.f        2 linkz.f      2 point.f

低レベルの「ヘルパー」ルーチンはすべてファイル etc.f にまとめられます。他のファイルには、1 つまたは複数の副プログラムが入ります。

まず、-c オプションを使用して、各ライブラリソースファイルをコンパイルし、対応する再配置可能な .o ファイルを生成します。

demo% f77 -c *.f
delte.f:
    delte:
    q_fixx:
dropx.f:
    dropx:
etc.f:
    q_fill:
    q_step:
    q_node:
    q_warn:
 ...以下省略
demo% ls
total 42   
 2 dropx.f     4 etc.o     2 linkz.f     4 markx.o
 2 delte.f     4 dropx.o   2 evalx.f     4 linkz.o     2 point.f
 4 delte.o     2 etc.f     4 evalx.o     2 markx.f     4 point.o
demo%

次に、ar を使用して、静的ライブラリ testlib.a を作成します。

demo% ar cr testlib.a *.o

このライブラリを使用するためには、コンパイルコマンド上にライブラリファイルを指定するか、-l-L コンパイルオプションを使用します。次の例では .a ファイルを直接使用します。

demo% cat trylib.f
C    testlib ルーチン群をテストするためのプログラム
            x=21.998
            call evalx(x)
            call point(x)
            print*, 'value ',x
            end
demo% f77 -o trylib trylib.f test_lib/testlib.a
trylib.f:
 MAIN:
demo%

主プログラムがライブラリ中の 2 つのルーチンだけを呼び出しているところに注目してください。ライブラリ中の呼び出されないルーチンが実行可能ファイルに読み込まれていないことを確認するには、nm によって表示される実行可能ファイル中の名前のリストで調べます。

demo% nm trylib | grep FUNC | grep point
[146]|     70016|     152|FUNC |GLOB |0     |8      |point_
demo% nm trylib | grep FUNC | grep evalx
[165]|     69848|     152|FUNC |GLOB |0     |8      |evalx_
demo% nm trylib | grep FUNC | grep delte
demo% nm trylib | grep FUNC | grep markx
demo% ...以下省略

上記の例では、grep は名前のリストから、実際に呼び出されたライブラリルーチンの項目だけを見つけます。

ライブラリを参照するもう 1 つの方法は、-llibrary-Lpath オプションを使用する方法です。ここでは、libname.a の規則に従うため、ライブラリの名前を変更しなければなりません。

demo% mv test_lib/testlib.a test_lib/libtestlib.a
demo% f77 -o trylib trylib.f -Ltest_lib -ltestlib
trylib.f:
 MAIN:

-llibrary-Lpath オプションは、他のユーザーが参照できるように、
/usr/local/lib のようなシステム上の一般的にアクセス可能なディレクトリにインストールされたライブラリに使用できます。たとえば、libtestlib.a
/usr/local/lib に置いた場合、次のコマンドを使用してコンパイルするよう、他のユーザーに知らせてください。

demo% f77 -o myprog myprog.f -L/usr/local/lib -ltestlib

静的ライブラリ中の置換

2、3 の要素だけをコンパイルし直す場合、ライブラリ全体をコンパイルし直す必要はありません。ar-r オプションを使用すると、静的ライブラリ中の個々の要素を置換できます。

例 : 静的ライブラリ中の 1 つのルーチンをコンパイルし直し、置換します。

demo% f77 -c point.f 
demo% ar r testlib.a point.o 
demo%

静的ライブラリ中のルーチンを整列する

ar を使用して構築しているときに静的ライブラリ中の要素を整列するには、コマンド lorder(1) と tsort(1) を使用します。

demo% ar cr mylib.a `lorder exg.o fofx.o diffz.o | tsort`

動的ライブラリを作成する

動的ライブラリファイルは、リンカー ld によって、実行開始後に実行可能ファイルにリンクできるコンパイル済みオブジェクトモジュールから構築されます。

動的ライブラリのもう 1 つの特長は、各プログラムのメモリーにモジュールを複製することなく、システムで実行中の他のプログラムからモジュールを使用できることです。この理由のため、動的ライブラリは共有ライブラリとも呼ばれます。

動的ライブラリには次のような特長があります。

動的ライブラリの長所と短所

動的ライブラリは、いくつかの長所と短所を考慮しなければなりません。

実行時までライブラリルーチンのリンクを延期するということは、実行可能ファイルのサイズが、ライブラリの静的バージョンを呼び出す同等な実行可能ファイルより小さいということを意味します。つまり、実行可能ファイルは、ライブラリルーチンのバイナリを含みません。

ライブラリを使用するいくつかのプロセスが同時にアクティブになったとき、メモリーの 1 つのコピーだけがメモリーに常駐し、そのコピーがすべてのプロセスによって共有されます。

実行時、ライブラリルーチンを読み込み、リンク編集するための余分なプロセッサ時間が必要になります。また、ライブラリの位置独立コーディングのため、静的ライブラリにおける再配置可能なコーディングよりも実行速度が遅くなる可能性があります。

ライブラリの共有によるメモリー利用率の減少が、システム全体のパフォーマンスにとってはよい結果となるはずです (メモリースワップの入出力アクセス時間が減少します)。

プログラムのパフォーマンス状況は、各プログラムによって大きく異なります。動的ライブラリと静的ライブラリの間でパフォーマンスの向上 (または低下) を予想することは必ずしもできません。しかし、必要なライブラリの両方の形式が利用できる場合、それぞれのライブラリを使用してユーザーのプログラムのパフォーマンスを評価する価値はあります。

位置独立コードと -pic

位置独立コード (PIC) は、リンクエディタによる再配置を必要とせず、プログラムの任意のアドレスにリンクできます。このようなコードは、本質的に同時プロセス間で共有できます。したがって、動的共有ライブラリを構築する場合、コンパイラオプション
-pic-PIC を使用して、位置に依存しないように構成要素ルーチンをコンパイルしなければなりません。

位置独立コードの中では、大域的なデータへの個々の参照は、大域的なオフセットテーブルへのポインタを通じての参照としてコンパイルされます。関数呼び出しはそれぞれ、手続きリンケージテーブルを通して、相対アドレッシングモードでコンパイルされます。この大域的なオフセットテーブルのサイズは、SPARC プロセッサでは 8K バイトに制限されています。-PIC コンパイラオプションは -pic と似ていますが、さらに、大域的なオフセットテーブルが 32 ビットのアドレス空間に渡ることを許可します。

f77f95 ではさらに柔軟なコンパイラフラグがあり、-xcode=v と指定すればバイナリオブジェクトのコードアドレス空間を指定できます。

このコンパイラフラグを使用して、32 ビット、44 ビット、または 64 ビットの絶対アドレス、さらに小型モデルと大型モデルの位置に依存しないコードを生成できます。
-xcode=pic13-pic に同等で、-xcode=pic32-PIC に同等です。詳細については f77(1)f95(1) のマニュアルページか『Fortran ユーザーズガイド』を参照してください。

リンクオプション

コンパイル時、ライブラリのリンクが動的であるか静的であるかを指定できます。このようなオプションは実際にはリンカーオプションですが、コンパイラによって認識されリンカーに渡されます。

-Bdynamic | -Bstatic

-Bdynamic は、可能であれば必ず共有動的リンクの優先を設定します。-Bstatic は、リンクを静的ライブラリだけに制限します。

静的バージョンと動的バージョンの両方とも利用できるとき、このオプションを使用して、コマンド行上から設定を切り替えます。

f77 prog.f -Bdynamic -lwells -Bstatic -lsurface

-dy | -dn

実行可能ファイル全体に対して動的リンクを許可または禁止します (このオプションは、コマンド行上では通常 1 度しか使用しません)。

-dy は、動的共有ライブラリへのリンクを許可します。-dn は、動的ライブラリへのリンクを禁止します。

64 ビット環境でのリンク

libm.alibc.a などの静的システムライブラリによっては、Solaris の 64 ビットオペレーティング環境では使用できないものもあります。このようなライブラリは動的ライブラリ専用として提供されます。64 ビット環境で -dn を使用すると、いくつかの静的システムライブラリが見つからないことを示すエラーが出力されます。また、コマンド行を -Bstatic で終了しても同じ結果になります。

特定のライブラリの静的バージョンとリンクするには、次のようなコマンド行を使用します。

f77 -o prog prog.f -Bstatic -labc -lxyz -Bdynamic

この場合、ユーザーの libabc.alibxyz.a ファイルがリンクされて (libabc.solibxyz.so ではない)、最後の -Bdynamic によってシステムライブラリを含めて残りのライブラリが動的にリンクされます。

さらに複雑な状況では、適切な -Bstatic-Bdynamic を必要に応じて使用して、リンク手順で各システムライブラリとユーザーライブラリを明示的に参照する必要があります。まず、LD_OPTIONS に '-Dfiles' を設定して、必要なライブラリをすべてリストします。次に、-nolib (システムライブラリの自動リンクを抑制する) を指定してリンク手順を実行し、必要なライブラリを明示的に参照します。次に例を示します。

f77 -xarch=v9 -o cdf -nolib cdf.o
-Bstatic -lF77 -lM77      -lsunmath -Bdynamic -lm -lc

命名規則

リンクローダーとコンパイラによって想定された動的ライブラリの命名規則に従うために、ユーザーが作成した動的ライブラリの名前には接頭辞 lib と接頭辞 .so を付けます。たとえば、libmyfavs.so は、コンパイラオプション -lmyfavs によって参照できます。

また、リンカーは任意のバージョン番号接頭辞も受け付けます。たとえば、
libmyfavs.so.1 はこのライブラリのバージョン 1 です。

コンパイラの -hname オプションは、構築される動的ライブラリの名前として name を記録します。

簡単な動的ライブラリ

動的ライブラリを構築するには、-pic-PIC オプションとリンカーオプション -G-ztext-hname を使用して、ソースファイルをコンパイルしなければなりません。これらのリンカーオプションは、コンパイラのコマンド行で利用できます。

静的ライブラリの例と同じファイルを使用して、動的ライブラリを作成できます。

例 : -pic と他のリンカーオプションを使用してコンパイルします。

demo% f77 -o libtestlib.so.1 -G -pic -ztext -hlibtestlib.so.1 *.f
delte.f:
    delte:
    q_fixx:
dropx.f:
    dropx:
etc.f:
    q_fill:
    q_step:
    q_node:
    q_warn:
evalx.f:
    evalx:
linkz.f:
    linkz:
markx.f:
    markx:
point.f:
    point:
Linking:

-G は、動的ライブラリを構築することをリンカーに伝えます。

-ztext は、位置独立コード以外のもの (たとえば、再配置可能なテキストなど) があった場合に警告を発します。

例 : リンク - 動的ライブラリを使用して実行可能ファイル a.out を作成します。

demo% f77 -o trylib -R`pwd` trylib.f libtestlib.so.1 
trylib.f:
 MAIN main:
demo% file trylib
trylib:ELF 32-bit MSB 実行可能 SPARC バージョン 1 [動的にリンクされて
います][取り除かれていません]
demo% ldd trylib
    libtestlib.so.1 => /export/home/U/Tests/libtestlib.so.1
    libF77.so.4 => /opt/SUNWspro/lib/libF77.so.4
    libc.so.1 => /usr/lib/libc.so.1
    libdl.so.1 => /usr/lib/libdl.so.1

例では、-R オプションを使用して、動的ライブラリへのパス (現在のディレクトリ) を実行可能ファイルにリンクしていることに注目してください。

file コマンドは、実行可能ファイルが動的にリンクされていることを表示します。

ldd コマンドは、実行可能ファイル trylib がいくつかの共有ライブラリを使用していることを表示します。この中には、前出の libtestlib.so.1 が入っています。また、f77 のデフォルトとして、libf77libdllibc も入っています。

Sun Fortran コンパイラが提供するライブラリ

次の表に、コンパイラと共にインストールされるライブラリを示します。

表 4-1   コンパイラと共に提供される主なライブラリ  
コンパイラと共に提供される主なライブラリ ファイル 必要なオプション
f77 の数学以外の関数 libF77
なし
f77 の数学以外の関数、マルチスレッドに
対応
libF77_mt
-parallel
f77 数学ライブラリ libM77
なし
f95 サポート組み込み手続き libfsu
なし
f95 インタフェース libfui
なし
f95 配列組み込み手続き libf*ai
なし
f95/f77 入出力互換性ライブラリ libf77compat
-tlf77compat
VMS ライブラリ libV77
-lV77
Pascal、Fortran、C で使用される
ライブラリ
libpfc
なし
サンの数学関数ライブラリ libsunmath
なし
POSIX の結合ライブラリ libFposix
-lFposix
f95 POSIX インタフェース libposix9
-lposix9
特別な実行時の検査を行う POSIX 結合ライブラリ libFposix_c
-lFposix_c


詳細については、math_libraries README ファイルを参照してください。

VMS ライブラリ

libV77 ライブラリは VMS ライブラリです。VMS ライブラリには、idatetime の 2 つの特別な VMS ルーチンが含まれています。

これらのルーチンを 1 つでも使用するときは、-lV77 オプションを指定します。

idatetime には、VMS バージョンと、UNIX 環境で利用できる従来のバージョンとがあります。-lV77 オプションを使用すると、idatetime ルーチンの VMS 互換バージョンの方が取り出されます。

これらのルーチンに関する詳細は、『Fortran ライブラリ・リファレンス』と『FORTRAN 77 言語リファレンス』を参照してください。

POSIX ライブラリ

Fortran 77 と共に提供される POSIX の結合には 2 つのバージョンがあります。

誤ったハンドルを引き渡すと、次のようになります。

検査には時間がかかり、libFposix_c は何倍か遅くなります。

どちらの POSIX ライブラリも静的および動的の形式があります。

提供される POSIX 結合は IEEE 標準規格 1003.9-1992 用です。

IEEE 1003.9 は、FORTRAN (X3.8-1978) に 1003.1-1990 を結合したものです。

詳細は、次の POSIX.1 のドキュメントを参照してください。

POSIX がどのようなものであるかを正確に知りたい方には、1003.9 と POSIX.1 のドキュメントが両方とも必要になります。

f95 の POSIX ライブラリは、libposix 9 です。

出荷可能なライブラリ

ユーザーの実行可能ファイルが、runtime.libraries README ファイルにリストされている Sun 動的ライブラリを使用している場合、ユーザーのライセンスには、そのライブラリをユーザーの顧客に再配布する権利が含まれます。

この README ファイルは READMEs ディレクトリにあります。

<インストールポイント>/SUNWspro/READMEs/ja

ヘッダーファイル、ソースコード、オブジェクトモジュール、オブジェクトモジュールの静的ライブラリは、いかなる形式でも再配布または公開しないでください。

詳細は、ソフトウェアライセンスを参照してください。


サン・マイクロシステムズ株式会社
Copyright information. All rights reserved.
ホーム   |   目次   |   前ページへ   |   次ページへ   |   索引