JavaScript is required to for searching.
ナビゲーションリンクをスキップ
印刷ビューの終了
リンカーとライブラリ     Oracle Solaris 10 8/11 Information Library (日本語)
search filter icon
search icon

ドキュメントの情報

はじめに

1.  Oracle Solaris リンカーの紹介

2.  リンカー

リンカーの起動

直接起動

コンパイラドライバを使用する

32 ビットリンカーと 64 ビットリンカー

クロスリンク編集

リンカーオプションの指定

入力ファイルの処理

アーカイブ処理

共有オブジェクトの処理

追加ライブラリとのリンク

ライブラリの命名規約

共有オブジェクトとアーカイブとの混合体へのリンク

コマンド行上のアーカイブの位置

リンカーが検索するディレクトリ

コマンド行オプションの使用

環境変数の使用

実行時リンカーが検索するディレクトリ

初期設定および終了セクション

シンボルの処理

シンボル解決

単純な解決

複雑な解決

重大な解決

未定義シンボル

実行可能ファイルの作成

共有オブジェクト出力ファイルの生成

ウィークシンボル

出力ファイル内の一時的シンボル順序

追加シンボルの定義

-u オプションを使用した追加シンボルの定義

シンボル参照の定義

絶対シンボルの定義

一時的シンボルの定義

シンボル定義の増強

シンボル範囲の縮小

シンボル削除

外部結合

文字列テーブルの圧縮

出力ファイルの生成

機能要件の特定

プラットフォーム機能の特定

マシン機能の指定

ハードウェア機能の特定

ソフトウェア機能の特定

ソフトウェア機能フレームポインタの処理

シンボル機能関数ファミリの作成

シンボル機能データ項目のファミリの作成

オブジェクト機能のシンボル機能への変換

機能ファミリの実行

再配置処理

ディスプレイスメント再配置

スタブオブジェクト

デバッグ支援

3.  実行時リンカー

4.  共有オブジェクト

5.  アプリケーションバイナリインタフェースとバージョン管理

6.  サポートインタフェース

7.  オブジェクトファイル形式

8.  スレッド固有領域 (TLS)

9.  mapfile

A.  リンカーのクイックリファレンス

B.  バージョン管理の手引き

C.  動的ストリングトークンによる依存関係の確立

D.  直接結合

E.  System V Release 4 (バージョン 1) Mapfile

F.  リンカーとライブラリのアップデートおよび新機能

索引

リンカーの起動

リンカーは、コマンド行から直接実行することもコンパイラドライバから呼び出すようにすることもできます。次の 2 つの節では、この両方の方法を詳しく説明します。ただし、通常は、コンパイラドライバを使用することをお勧めします。コンパイル環境は、多くの場合、コンパイラドライバだけが認識し、頻繁に変化する複雑な操作の連続によって構成されています。

直接起動

リンカーを直接的に起動させる場合は、出力を作成するために必要なすべてのオブジェクトファイルとライブラリを提供する必要があります。リンカーは、出力の作成に使用するつもりのオブジェクトモジュールまたはライブラリに関して、仮説を立てることをしません。たとえば、次のコマンドは、入力ファイル test.o のみを使って a.out という名前の動的実行可能ファイルを作成するように、リンカーに命令します。

$ ld test.o

通常、動的実行可能ファイルには、特殊な起動コードおよび終了処理コードが必要です。このコードは、言語またはオペレーティングシステム固有のもので、通常、コンパイラドライバによって提供されるファイルを通じて提供されます。

また、自分専用の初期設定コードおよび終了コードも指定できます。このコードは、実行時リンカーで正確に認識され、使用できるようにするために、正確にカプセル化およびラベル付けを行う必要があります。このカプセル化とラベル付けも、コンパイラドライバによって提供されたファイルを通じて提供されます。

実行可能ファイルや共有オブジェクトなどの実行時オブジェクトを作成するときは、コンパイラドライバを使ってリンカーを起動する必要があります。リンカーの直接起動をお勧めするのは、-r オプションを使用して、中間再配置可能オブジェクトを作成する場合だけです。

コンパイラドライバを使用する

リンカーを利用する一般的な方法は、言語固有のコンパイラドライバを使用する方法です。アプリケーションを構成する入力ファイルとともに、cc(1)、CC(1) などのコンパイラドライバを指定します。すると、コンパイラドライバは、追加ファイルとデフォルトライブラリを追加して、リンク編集を完了させます。これらの追加ファイルは、次のようにコンパイルの呼び出しを拡張することによって参照できます。

$ cc -# -o prog main.o
/usr/ccs/bin/ld -dy /opt/COMPILER/crti.o /opt/COMPILER/crt1.o \
/usr/ccs/lib/values-Xt.o -o prog main.o \
-YP,/opt/COMPILER/lib:/usr/ccs/lib:/usr/lib -Qy -lc \
/opt/COMPILER/crtn.o

注 - この例は、コンパイラドライバによって組み込まれた実際のファイルの例ですが、リンカー起動の表示に使用されるメカニズムによって異なる場合があります。


32 ビットリンカーと 64 ビットリンカー

リンカーは 32 ビットアプリケーションおよび 64 ビットアプリケーションとして提供されています。各リンカーは 32 ビットオブジェクトおよび 64 ビットオブジェクトで動作可能です。ただし、リンク編集に 32 ビットオブジェクトと 64 ビットオブジェクトを混在させることはできません。32 ビットリンカーも 64 ビットオブジェクトを生成できますが、生成されるオブジェクトのサイズは、.bss を除いて、2G バイトに制限されます。

デフォルトでは、コンパイラドライバにより 32 ビットリンカーが実行されます。このリンカーは、コマンド行をチェックして、リンク編集を完了するために 64 ビットリンカーを実行すべきかどうかを判別します。

32 ビットのリンク編集と 64 ビットのリンク編集を区別する際、通常はコマンド行オプションは必要ありません。リンカーの操作モードは、コマンド行の最初の入力再配置可能オブジェクトの ELF クラスによって制御されます。mapfile またはアーカイブライブラリからだけ行われるリンクなどの特別なリンク編集は、コマンド行オブジェクトの影響を受けません。これらのリンク編集はデフォルトで 32 ビットモードなので、64 ビットリンク編集を行うときはコマンド行オプションを指定する必要があります。

64 ビットリンカーは、次のいずれかの条件の下で実行されます。

きわめて大規模な 32 ビットオブジェクトを作成すると、32 ビットリンカーで使用可能な仮想メモリーを使い果たしてしまうことがあります。-z altexec64 オプションを指定することで、対応する 64 ビットリンカーの使用を強制できます。64 ビットリンカーは、32 ビットオブジェクトの構築に、より大きな仮想アドレス空間を提供します。


注 - LD_ALTEXEC 環境変数を使用して、代替リンカーを指定することもできます。


クロスリンク編集

このリンカーは SPARC または x86 を対象としたクロスリンカーで、32 ビットオブジェクトまたは 64 ビットオブジェクトにリンクできます。32 ビットオブジェクトと 64 ビットオブジェクトを混在させることはできません。同様に、1 つの機械タイプのオブジェクトのみが許可されます。

通常、コマンド行オプションではリンク編集のターゲットを区別する必要はありません。リンカーは、コマンド行の最初の入力再配置可能オブジェクトの ELF 機械タイプを使用して、操作するモードを制御します。mapfile またはアーカイブライブラリからだけ行われるリンクなどの特別なリンク編集は、コマンド行オブジェクトの影響を受けません。これらのリンク編集のデフォルトは、32 ビットのネイティブターゲットです。リンク編集ターゲットを明示的に定義するには、-z target オプションを使用します。