JavaScript is required to for searching.
ナビゲーションリンクをスキップ
印刷ビューの終了
Oracle Solaris 11.1 リンカーとライブラリガイド     Oracle Solaris 11.1 Information Library (日本語)
このドキュメントの評価
search filter icon
search icon

ドキュメントの情報

はじめに

パート I リンカーおよび実行時リンカーの使用

1.  Oracle Solaris リンカーの紹介

2.  リンカー

リンカーの起動

直接起動

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

クロスリンク編集

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

入力ファイルの処理

アーカイブ処理

共有オブジェクトの処理

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

ライブラリの命名規約

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

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

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

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

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

シンボルの処理

シンボルの可視性

シンボル解決

単純な解決

複雑な解決

重大な解決

未定義シンボル

実行可能ファイルの作成

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

ウィークシンボル

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

追加シンボルの定義

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

シンボル参照の定義

絶対シンボルの定義

一時的シンボルの定義

シンボル定義の増強

シンボル範囲の縮小

シンボル削除

外部結合

文字列テーブルの圧縮

出力ファイルの生成

機能要件の特定

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

マシン機能の指定

ハードウェア機能の特定

ソフトウェア機能の特定

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

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

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

機能ファミリの実行

再配置処理

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

スタブオブジェクト

補助オブジェクト

デバッガによる補助オブジェクトのアクセスと使用

親オブジェクト

デバッグ支援

3.  実行時リンカー

4.  共有オブジェクト

パート II クイックリファレンス

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

パート III 詳細情報

6.  直接結合

7.  システムのパフォーマンスを最適化するオブジェクトの構築

8.  mapfile

9.  インタフェースおよびバージョン管理

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

11.  拡張性メカニズム

パート IV ELF アプリケーションバイナリインタフェース

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

13.  プログラムの読み込みと動的リンク

14.  スレッド固有ストレージ (TLS)

パート V 付録

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

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

索引

ドキュメントの品質向上のためのご意見をください
簡潔すぎた
読みづらかった、または難し過ぎた
重要な情報が欠けていた
内容が間違っていた
翻訳版が必要
その他
Your rating has been updated
貴重なご意見を有り難うございました!

あなたの貴重なご意見はより良いドキュメント作成の手助けとなります 内容の品質向上と追加コメントのためのアンケートに参加されますか?

補助オブジェクト

オブジェクトには、デフォルトで割り当て可能なセクションと割り当て不可のセクションの両方が含まれています。割り当て可能なセクションは、実行可能コードとそのコードが実行時に必要とするデータが含まれているセクションです。割り当て不可のセクションには、実行時にオブジェクトを実行するために必要でない補足的な情報が含まれています。これらのセクションは、デバッガおよびその他の可観測性ツールの動作をサポートします。オブジェクト内の割り当て不可のセクションは、実行時にオペレーティングシステムによってメモリーに読み込まれないため、どのようなサイズであっても、メモリーの使用やその他の実行時パフォーマンスの側面に影響を与えません。

利便性のため、割り当て可能なセクションと割り当て不可のセクションは、通常どちらも同じファイルに保持されます。しかし、これらのセクションを分離した方が有用な場合があります。

従来は、これらの問題に対処するため、割り当て不可のセクションがオブジェクトから除去されていました。除去は有効ですが、あとで必要になる可能性があるデータも破棄されます。Solaris リンカーでは、代わりに割り当て不可のセクションを補助オブジェクトに書き込むことができます。この機能は、-z ancillary コマンド行オプションを使用すると有効になります。

$ ld ... -z ancillary[=outfile] ...

補助ファイルには、デフォルトでプライマリ出力オブジェクトと同じ名前と .anc ファイル拡張子が付けられます。ただし、-z ancillary オプションに outfile の値を指定することで、別の名前を付けることができます。

-z ancillary が指定されると、リンカーは次の処理を実行します。

この構成により、プライマリオブジェクトと補助オブジェクトのどちらからでも、セクションヘッダーの完全なリスト、完全なシンボルテーブル、およびプライマリオブジェクトと補助オブジェクトの完全なリストを取得できるようになっています。

次の例は、補助オブジェクトのベースとなる実装を示しています。補助オブジェクトは、ほかの点では標準的なコンパイルに -z ancillary コマンド行オプションを追加することで作成されます。file ユーティリティーは、結果として a.out という名前の実行可能ファイルと、a.out.anc という名前の関連する補助オブジェクトが生成されたことを示しています。

$ cat hello.c
#include <stdio.h>

int
main(int argc, char **argv) 
{ 
        (void) printf("hello, world\n");
        return (0);
}
$ cc -g -zancillary hello.c
$ file a.out a.out.anc
a.out: ELF 32-bit LSB executable 80386 Version 1 [FPU], dynamically
       linked, not stripped, ancillary object a.out
a.out.anc: ELF 32-bit LSB ancillary 80386 Version 1, primary object a.out
$ ./a.out
hello world

生成されたプライマリオブジェクトは、通常の方法で実行できる普通の実行可能ファイルです。補助オブジェクトを使用せずに作成し、その後 strip または mcs コマンドを使用して割り当て不可の内容を取り除いた実行可能ファイルと比べて、実行時の違いはありません。

前述のように、プライマリオブジェクトと補助オブジェクトには同じセクションヘッダーが含まれています。このしくみを理解するには、elfdump ユーティリティーを使用してこれらのセクションヘッダーを表示して比較すると有益です。次の表に、前のリンク編集の例からヘッダーを選択するためのセクションヘッダーの情報を示します。

インデックス
セクション名
タイプ
プライマリフラグ
補助フラグ
プライマリサイズ
補助サイズ
13
.text
PROGBITS
ALLOC EXECINSTR
ALLOC EXECINSTR SUNW_ABSENT
0x131
0
20
.data
PROGBITS
WRITE ALLOC
WRITE ALLOC SUNW_ABSENT
0x4c
0
21
.symtab
SYMTAB
0
0
0x450
0x450
22
.strtab
STRTAB
STRINGS
STRINGS
0x1ad
0x1ad
24
.debug_info
PROGBITS
SUNW_ABSENT
0
0
0x1a7
28
.shstrtab
STRTAB
STRINGS
STRINGS
0x118
0x118
29
.SUNW_ancillary
SUNW_ancillary
0
0
0x30
0x30

ほとんどのセクションのデータは、2 つのファイルのどちらかに存在し、もう一方のファイルには存在しません。SHF_SUNW_ABSENT セクションヘッダーフラグは、データが存在しないときに設定されます。実行時に必要な割り当て可能なセクションのデータは、プライマリオブジェクトに含まれています。デバッグに使用され、実行時には必要でない割り当て不可のセクションのデータは、補助ファイルに配置されます。割り当て不可のセクションの小さなセットが、両方のファイルにすべて存在します。これらは、プライマリオブジェクトと補助オブジェクトを関連付けるために使用される .SUNW_ancillary セクション、セクション名文字列テーブル .shstrtab、シンボルテーブル .symtab、およびその関連文字列テーブル .strtab です。

プライマリオブジェクトからシンボルテーブルを取り除くことができます。シンボルテーブルがないオブジェクトを検出したデバッガは、.SUNW_ancillary セクションを使用して補助オブジェクトを特定し、内部に含まれるシンボルにアクセスできます。

プライマリオブジェクトと関連するすべての補助オブジェクトには、すべてのオブジェクトを識別して関連付けることができる .SUNW_ancillary セクションが含まれています。

$ elfdump -T SUNW_ancillary a.out a.out.anc
a.out:
Ancillary Section:  .SUNW_ancillary
     index  tag                    value
       [0]  ANC_SUNW_CHECKSUM     0x8724              
       [1]  ANC_SUNW_MEMBER       0x1         a.out
       [2]  ANC_SUNW_CHECKSUM     0x8724         
       [3]  ANC_SUNW_MEMBER       0x1a3       a.out.anc
       [4]  ANC_SUNW_CHECKSUM     0xfbe2              
       [5]  ANC_SUNW_NULL         0                   

a.out.anc:
Ancillary Section:  .SUNW_ancillary
     index  tag                    value
       [0]  ANC_SUNW_CHECKSUM     0xfbe2              
       [1]  ANC_SUNW_MEMBER       0x1         a.out
       [2]  ANC_SUNW_CHECKSUM     0x8724              
       [3]  ANC_SUNW_MEMBER       0x1a3       a.out.anc
       [4]  ANC_SUNW_CHECKSUM     0xfbe2              
       [5]  ANC_SUNW_NULL         0          

両方のオブジェクトの補助セクションは、同じ数の要素を含み、最初の要素を除いて同一です。プライマリオブジェクトから先に、ファイル名を指定する MEMBER 要素と、それに続いてオブジェクトを識別する CHECKSUM によって、各オブジェクトが導入されます。この例では、プライマリオブジェクトは a.out であり、そのチェックサムは 0x8724 です。補助オブジェクトは a.out.anc であり、そのチェックサムは 0xfbe2 です。.SUNW_ancillary セクションの (プライマリオブジェクトの MEMBER 要素の前にある) 最初の要素は、常に検査しているファイルのチェックサムを含む CHECKSUM 要素です。

デバッガによる補助オブジェクトのアクセスと使用

デバッガおよびその他の可観測性ツールは、オブジェクトの完全なビューを作成するために、プライマリオブジェクトファイルと補助オブジェクトファイルで見つかった情報をマージする必要があります。これは、1 つのファイルの情報を処理するのとまったく同じです。このマージは、同じセクションヘッダーを含むプライマリオブジェクトと補助オブジェクト、および単一のシンボルテーブルによって簡略化されます。

デバッガでこれらのファイルに含まれる情報をまとめるには、次の手順を使用します。

  1. プライマリオブジェクトまたはいずれかの補助オブジェクトから先に、.SUNW_ancillary セクションを見つけます。このセクションが存在することで、そのオブジェクトが補助グループの一部として特定されます。このセクションには、ファイルの完全なリストを取得し、それらのどれが現在検査しているファイルかを特定するために使用できる情報が含まれています。

  2. 検査しているオブジェクトのセクションヘッダー配列を最初のテンプレートとして使用して、メモリー内にセクションヘッダー配列を作成します。

  3. .SUNW_ancillary セクションで識別された各ファイルを順に開き、読み取ります。ファイルごとに、SHF_SUNW_ABSENT フラグが設定されていない各セクションの情報をメモリー内のセクションヘッダー配列に埋め込みます。

この結果、すべてのセクションのデータへのポインタを含むセクションヘッダーの完全なメモリー内コピーができます。この情報を取得したあと、デバッガは単一ファイルの場合と同じように処理を続行し、実行中のプログラムにアクセスしてそれを制御できます。


注 - 補助オブジェクトの ELF 定義では、1 つのプライマリオブジェクトと任意の数の補助オブジェクトが提供されます。現時点では、Oracle Solaris リンカーはすべての割り当て不可のセクションを含む単一の補助オブジェクトのみを生成します。これは将来変更される可能性があります。デバッガおよびその他の可観測性ツールは、補助オブジェクトが複数存在する一般的なケースに対応できるように作成されるべきです。