Solaris 移行ガイド

リンカ

このリリースではリンクエディタ ld(1) に対していくつかの変更があります。最も重要な変更は新しい ELF のファイルフォーマットを処理する機能です。


注 -

ライブラリと実行可能プログラムを構築するには、リンカを直接起動することよりもコンパイラドライバによる方法をお勧めします。コンパイラは、リンカが必要とする多数のファイルを自動的に供給します。


ライブラリを混合することはできません。32 ビットプログラムは 32 ビットライブラリ、64 ビットプログラムは 64 ビットライブラリとリンクする必要があります。ELF32 オブジェクトは他の ELF32 オブジェクト、ELF64 オブジェクトは他の ELF64 オブジェクトとリンクします。

リンクエディタオプションの相違

新しいリンカでリネームされたオプションもあれば同じものもあり、また不要になったオプションもあります。表 15-1 では SunOS 4.x の ld を Solaris 7 の ld コマンドと比較します。

表 15-1 に続く節で、リンク作業がオプションの相違によってどのように影響を受けるかについて説明します。

表 15-1 ld オプションの比較

SunOS 4.x のオプション 

Solaris 7 での変更 

注 

-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

デフォルト 

-z としての SVR4 実行可能プログラムフォーマットのデマンドページ

共用ライブラリの作成

Solaris 7 で共用ライブラリを作成するには、-G オプションを指定する必要があります。SunOS 4.x では、-e オプションなしで共用ライブラリを作成することをリンカが自分で判断しますが、Solaris 7 では共用ライブラリがエントリポイントを持つ可能性があるため、このオプションは使用できなくなりました。

実行可能ファイルの作成

-Bdynamic-Bstatic オプションはまだ利用できますが、その動作はかなり異なります。現在では、これらのオプションは実行可能バインディングではなくライブラリのインクルードを指します。実行可能バインディングは、Solaris 7 で新しい -dy-dn オプションでのみ排他的に設定されます。-dy オプションがデフォルトです。これは、動的にリンクされた実行可能ファイルを作成するために必要です。-dn オプションは、静的にリンクされた実行可能ファイルを作成するために必要です。

-Bdynamic-Bstatic オプションは、-dy オプションを使用したときだけ適用されます。 -Bdynamic はリンクエディタに共用ライブラリを含めるように指示し、-Bstatic はアーカイブライブラリを含めるように指示します。これらのオプションは、次の -Bdynamic または -Bstatic オプション指定が現れるまで、-l 引数を管理する切り替え (トグル) として機能します。

次の例に、同様の実行可能プログラムを作成するのに使用できる SunOS 4.x と Solaris 7 コマンドを示します。

ライブラリ検索パスの指定

SunOS 4.x では、-L オプションを付けて指定したディレクトリはリンク時に検索され、その情報は実行時に使用するために保持されていました。この動作は現在では、 -L-R オプションに分けられています。 -L オプションはリンク時に検索するディレクトリを指定し、-R オプションはリンカに対して、実行時に使用するために保持する検索パスを指示します。詳細については、「検索パスの規則」を参照してください。

-Bdynamic-Bstatic オプションと同様に、 -L オプションの位置には意味があります。これは、それに続く -l オプションにだけに適用されます。

検索パスの規則

動的リンカと実行時リンカが SunOS 4.x リンカによって使用されたのとは異なるアルゴリズムを使って検索パスを決定します。

以下の例では、SunOS 4.x と Solaris 7 の動的リンカおよび実行時リンカの検索パスを比較します。Solaris 7 では、リンクエディタと実行時リンカの検索パスは LD_LIBRARY_PATH 設定値の影響を受けることに注意してください。ただし、実行時リンカでは、プログラムが LD_LIBRARY_PATH を設定しないで共用ライブラリを検索できるほか、共用ライブラリのローディングがさらに効率的になります。したがって、Solaris 7 では $ORIGIN を代用することをお勧めします。prog がインストールされた位置からの組み込みライブラリの相対パスを指定してプログラムをビルドしなければならないからです。 たとえば、.../package/bin/prog は、.../package/lib/libmine.so.1 を使用します。

SunOS 4.x リンカ検索パス

LD_LIBRARY_PATH=dirlist1 がある Solaris 7 リンカ検索パス

LD_LIBRARY_PATH=dirlist1, dirlist2) がある Solaris 7 リンカ検索パス

Solaris 7 リンカは、$ORIGIN を使ってパスを検索します。

また、Solaris 7 では、LD_LIBRARY_PATH_ 64LD_LIBRARY_PATH の 64 ビット専用バージョンです。

バージョン番号

SunOS 4.x は、共用ライブラリに対してメジャーとマイナーの両方のバージョン番号をサポートしていました。Solaris 7 は、メジャーバージョン番号だけをサポートします。バイナリ互換性のサポートについては、メジャーおよびマイナーバージョン番号は SunOS 4.x 共用ライブラリで認識されます。これらのライブラリは、SunOS 4.x ソフトウェアにあったのと同じメジャーおよびマイナーバージョン番号を保持するために必要となります。

表 15-2 は、SunOS 4.x および Solaris 7 の共用ライブラリのバージョンを示します。

表 15-2 共用ライブラリの例

SunOS 4.x 

Solaris 7 

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 7 環境では、メジャー番号はサポートされていますが、デフォルトのリンクエディタはバージョン番号を無視します。前の例では、build envrionment linker は現在では libdl.so と特定のバージョンのファイルを指すシンボリックリンクを検索します。

リンカによって参照された時、デフォルトでは、動的に実行可能なオブジェクトまたは共有オブジェクト中の dependency レコードは関連する共有オブジェクトのファイル名です。依存性の指定をより一貫した方法にするために、共有オブジェクトは実行時に参照されるべきファイル名をそれ自身に記録することができます。これはライブラリファイルをリンクする時に -h オプションによって指定します。

Solaris 7 では、シンボリックリンクはほとんどのライブラリに対して作成されています。メジャー番号をつけて新しい共用ライブラリを構築し、それから最もよく使用するライブラリのバージョンを指すシンボリックリンクを作成してください。

新しいユーティリティの dump(1) (「ファイルのバックアップと復元」を参照) により、オブジェクトファイルのデバッグ、または静的および動的リンクのチェックが容易になります。dump -L オプションは、実行可能プログラムに含まれる実行時リンカに必要な情報を表示します。この情報は、ELF ファイルの動的セクションに含まれます。 RPATH エントリは、ld. の -R オプションにより指定された検索パスを表示します。

例を以下に示します。

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