Solaris 2.6 ではリンクエディタ ld(1) に対していくつかの変更があります。最も重要な変更は新しい ELF のファイルフォーマットを処理する機能です。
ライブラリと実行可能プログラムを構築するには、リンカを直接起動することよりもコンパイラドライバによる方法をお勧めします。コンパイラは、リンカが必要とする多数のファイルを自動的に供給します。
新しいリンカでリネームされたオプションもあれば同じものもあり、また不要になったオプションもあります。表 15-3 では SunOS 4.x の ld を Solaris 2.6 の ld コマンドと比較します。
表 15-3 に続く節で、リンク作業がオプションの相違によってどのように影響を受けるかについて説明します。
表 15-3 ld オプションの比較
SunOS 4.x のオプション |
Solaris 2.6 での変更 |
注 |
---|---|---|
-align datum |
-M mapfile |
mapfile と異なるセクションの使用 |
-assert definitions |
デフォルト |
|
-assert nodefinitions |
-znodefs |
警告ではなく致命的エラーを発行 |
-assert nosymbolic |
-zdefs |
警告ではなく致命的エラーを発行 |
-assert pure-text |
-ztext |
警告ではなく致命的エラーを発行 |
-A name |
変更なし |
dlopen(3X) とdlclose(3X) はこの動作に接近可能 |
-Bdynamic |
-Bdynamic |
共用ライブラリの取り込みにのみ適用される。動的にリンクされた実行可能プログラムを構築するには -dy (デフォルト) を使用。「実行可能ファイルの作成」を参照。 |
-Bnosymbolic |
-zdefs |
|
-Bstatic |
-dn & -Bstatic |
動的なリンカを完全に除去するには、-dn オプションを指定しなければならない。アーカイブライブラリを取り込むために動的モードで -Bstatic を使用 (トグルとして使用。「実行可能ファイルの作成」を参照)。 |
-Bsymbolic |
-Bsymbolic |
このオプションを付けて-assert nosymbolic も取得する。 |
-d -dc -dp |
デフォルト |
オフに設定するには、SVR4 で -b オプションを使用しなければならない。 |
-D hex |
-M mapfile |
mapfile には、希望する結果を達成するためにいろいろなメカニズムが含まれる。 |
-e entry |
-e entry |
|
no -e |
-G |
共有オブジェクトを作成する。 |
-lx[.v] |
-lx |
共用ライブラリのメジャー番号が示すバージョンだけが現在サポートされている。 |
-Ldir |
-Ldir |
dir は実行可能プログラムに記録されない。かわりに、-R オプションを使用。 |
-M |
-m |
|
-n |
デフォルト |
SVR4 の実行可能プログラムのフォーマットは、ディスクイメージを -n として圧縮 |
-N |
変更なし |
|
-o name |
-o name |
|
-p |
デフォルト |
-M mapfile で取り消し可能。 |
-r |
-r |
|
-S |
変更なし |
|
-s |
-s |
|
-t |
変更なし |
|
-T hex |
-M mapfile |
mapfile には、希望する結果を達成するためにいろいろなメカニズムが含まれる。 |
-Tdata hex |
-M mapfile |
mapfile には、希望する結果を達成するためにいろいろなメカニズムが含まれる。 |
-u name |
-u name |
|
-x |
変更なし |
|
-X |
変更なし |
|
-y sym |
変更なし |
|
-z |
デフォルト |
Solaris 2.6 で共用ライブラリを作成するには、-G オプションを指定する必要があります。SunOS 4.x では、-e オプションなしで共用ライブラリを作成することをリンカが自分で判断しますが、Solaris 2.6 では共用ライブラリがエントリポイントを持つ可能性があるため、このオプションは使用できなくなりました。
-Bdynamic と -Bstatic オプションはまだ利用できますが、その動作はかなり異なります。現在では、これらのオプションは実行可能バインディングではなくライブラリのインクルードを指します。実行可能バインディングは、Solaris 2.6 で新しい -dy と -dn オプションでのみ排他的に設定されます。-dy オプションがデフォルトです。これは、動的にリンクされた実行可能ファイルを作成するために必要です。-dn オプションは、静的にリンクされた実行可能ファイルを作成するために必要です。
-Bdynamic と -Bstatic オプションは、-dy オプションを使用したときだけ適用されます。 -Bdynamic はリンクエディタに共用ライブラリを含めるように指示し、-Bstatic はアーカイブライブラリを含めるように指示します。これらのオプションは、次の -Bdynamic または -Bstatic オプション指定が現れるまで、-l 引数を管理する切り替え (トグル) として機能します。
次の例に、同様の実行可能プログラムを作成するのに使用できる SunOS 4.x と Solaris 2.6 コマンドを示します。
sunos4.1% ld Bstatic test.o -lx
libx.a を使用して、静的な実行可能ファイルを作成する。
sunos5.x% ccdn test.o -lx
libx.a を使用して、静的な実行可能ファイルを作成する。
sunos4.1% ld Bdynamic test.o -lx
libx.so を使用して、動的な実行可能ファイルを作成する。
sunos5.x% cc test.o -lx
libx.so を使用して、動的な実行可能ファイルを作成する。
sunos4.1% ld Bdynamic test.o Bstatic -lx
libx.a を使用して、動的な実行可能ファイルを作成する。
sunos5.x% cc test.o Bstatic -lx
libx.a を使用して、動的な実行可能ファイルを作成する。
SunOS 4.x では、-L オプションを付けて指定したディレクトリはリンク時に検索され、その情報は実行時に使用するために保持されていました。この動作は現在では、 -L と -R オプションに分けられています。 -L オプションはリンク時に検索するディレクトリを指定し、-R オプションはリンカに対して、実行時に使用するために保持する検索パスを指示します。詳細については、「検索パスの規則」を参照してください。
-Bdynamic と -Bstatic オプションと同様に、 -L オプションの位置には意味があります。これは、それに続く -l オプションにだけに適用されます。
動的リンカと実行時リンカが SunOS 4.x リンカによって使用されたのとは異なるアルゴリズムを使って検索パスを決定します。
以下の例では、SunOS 4.x と Solaris 2.6 の動的リンカおよび実行時リンカの検索パスを比較します。Solaris 2.6 では、リンクエディタと実行時リンカの検索パスは LD_LIBRARY_PATH
設定値の影響を受けることに注意してください。
SunOS 4.x リンカ検索パス
リンクエディタ: -L, LD_LIBRARY_PATH
, /usr/lib, /usr/local/lib
実行時リンカ: LD_LIBRARY_PATH
, -L, /usr/lib, /usr/local/lib
LD_LIBRARY_PATH
=dirlist1 がある Solaris 2.6 リンカ検索パス
リンクエディタ: -L, dirlist1, /usr/ccs/lib, /usr/lib
実行時リンカ: dirlist1, -R, /usr/lib
LD_LIBRARY_PATH
=dirlist1, dirlist2) がある Solaris 2.6 リンカ検索パス
リンクエディタ: dirlist1, -L, dirlist2, /usr/ccs/lib, /usr/lib
SunOS 4.x は、共用ライブラリに対してメジャーとマイナーの両方のバージョン番号をサポートしていました。Solaris 2.6 は、メジャーバージョン番号だけをサポートします。バイナリ互換性のサポートについては、メジャーおよびマイナーバージョン番号は SunOS 4.x 共用ライブラリで認識されます。これらのライブラリは、SunOS 4.x ソフトウェアにあったのと同じメジャーおよびマイナーバージョン番号を保持するために必要となります。
表 15-4 は、SunOS 4.x および Solaris 2.6 の共用ライブラリのバージョンを示します。
表 15-4 共用ライブラリの例
SunOS 4.x |
Solaris 2.6 |
---|---|
libc.so.1.7 |
libc.so.1 |
libdl.so.1.0 |
libdl.so.1 |
SunOS 4.x システムソフトウェアにおいては、 -l オプションを指定した場合、build environment linker はメジャーおよびマイナー番号をともに持つライブラリを検索しました。たとえば、-ldl を指定した場合、ライブラリ、libdl.so.1.0 がリンクされます。Solaris 2.6 環境では、メジャー番号はサポートされていますが、デフォルトのリンクエディタはバージョン番号を無視します。前の例では、build envrionment linker は現在では libdl.so と特定のバージョンのファイルを指すシンボリックリンクを検索します。
リンカによって参照された時、デフォルトでは、動的に実行可能なオブジェクトまたは共有オブジェクト中の dependency レコードは関連する共有オブジェクトのファイル名です。依存性の指定をより一貫した方法にするために、共有オブジェクトは実行時に参照されるべきファイル名をそれ自身に記録することができます。これはライブラリファイルをリンクする時に -h オプションによって指定します。
Solaris 2.6 では、シンボリックリンクはほとんどのライブラリに対して作成されています。メジャー番号をつけて新しい共用ライブラリを構築し、それから最もよく使用するライブラリのバージョンを指すシンボリックリンクを作成してください。
新しいユーティリティの dump(1) (「ファイルのバックアップと復元」を参照) により、オブジェクトファイルのデバッグ、または静的および動的リンクのチェックが容易になります。dump -L オプションは、実行可能プログラムに含まれる実行時リンカに必要な情報を表示します。この情報は、ELF ファイルの動的セクションに含まれます。 RPATH
エントリは、ld. の -R オプションにより指定された検索パスを表示します。
例を以下に示します。
libx.so.1 から libx.so へのリンクを作成します。
examples% cc -G -o libx.so.1 -h libx.so.1 libx.o examples% cp libx.so.1 /mylibs examples% ln -s /mylibs/libx.so.1 /mylibs/libx.so examples% dump -Lv libx.so.1 libx.so.1: **** DYNAMIC SECTION INFORMATION **** .dynamic : [INDEX] Tag Value [1] INIT 0x3b8 [2] FINI 0x3f4 [3] SONAME libx.so.1 [4] HASH 0x94 [5] STRTAB 0x33c [6] SYMTAB 0x14c [7] STRSZ 0x62 [8] SYMENT 0x10 [9] PLTGOT 0x10404 [10] PLTSZ 0xc [11] PLTREL 0x7 [12] JMPREL 0x3ac [13] RELA 0x3a0 [14] RELASZ 0x18 [15] RELAENT 0xc
ライブラリが他の動的ライブラリを必要とするときは、次の例に示すように、RPATH
と共に動的ライブラリを指定するようにします。
次の例では prog.c をコンパイルし、(前の例で構築された) libx.so を動的にリンクし、バイナリが実行のためカレントディレクトリ情報を保持するように指定します。この例は、コンパイル済みプログラムの prog.c についての dump 出力を示します。ここで、前の例の SONAME
フィールドに格納された情報は、prog により NEEDED
として示されます。prog が実行されると、libx.so.1 は、libx.so でも、異なるバージョンにリンクされます。
examples% cc -o prog prog.c -L/mylibs -R/mylibs -lx example% dump -Lv prog prog: **** DYNAMIC SECTION INFORMATION **** .dynamic : [INDEX] Tag Value [1] NEEDED libx.so.1 [2] NEEDED libc.so.1 [3] INIT 0x1b1ac [4] FINI 0x1b248 [5] RPATH /mylibs [6] HASH 0x100e8 [7] STRTAB 0x17f90 [8] SYMTAB 0x12be0 [9] STRSZ 0x31e1 [10] SYMENT 0x10 [11] DEBUG 0x0 [12] PLTGOT 0x2b25c [13] PLTSZ 0x30 [14] PLTREL 0x7 [15] JMPREL 0x1b180 [16] RELA 0x1b174 [17] RELASZ 0x3c [18] RELAENT 0xc