load およびloadAndInitサブルーチン
目的
モジュールを現行プロセスにロードします。
構文
int *load ( ModuleName, Flags, LibraryPath)
char *ModuleName;
uint Flags;
char *LibraryPath; int *loadAndInit ( ModuleName, Flags, LibraryPath)
char *ModuleName;
uint Flags;
char *LibraryPath;説明
load および loadAndInit サブルーチンは、指定されたモジュールを呼び出しプロセスのアドレス・スペースにロードします。 モジュールは、通常のファイルまたはアーカイブのメンバーにすることができます。 32 ビット・プロセスのアドレス・スペースに新規モジュールを追加すると、ロード操作によってブレーク値が変更されることがあります。
ロード サブルーチンは、C++ モジュールをロードするための推奨される方法ではありません。 代わりにloadAndInitサブルーチンを使用する。 loadAndInitサブルーチンは、loadと同じインターフェースを使用するが、C++の初期化を行う。
EXEC サブルーチンは ロード サブルーチンと似ていますが、以下の点が異なります。
- ロード サブルーチンは、現行プログラムを新しいプログラムに置き換えません。
- exec サブルーチンには、明示的なライブラリー・パス・パラメーターはありません。 LIBPATH および LD_LIBRARY_PATH 環境変数のみがあります。 また、これらのライブラリー・パス環境変数は、 EXEC サブルーチンを使用するプログラムに呼び出し元より多くの特権がある場合 (例えば、 セット UID プログラムの場合) には無視されます。
大規模なアプリケーションは、同じプロセス内で実行できる 2 つの方法のいずれかで、1 つ以上のモジュールに分割することができます。 1 つ目の方法は、アプリケーションの各モジュールを個別に作成し、必要に応じて ロード を使用してモジュールを明示的にロードすることです。 もう 1 つの方法は、インポートおよびエクスポートされるシンボルを定義することによって、モジュールが作成されるときのモジュール間の関係を指定することです。
モジュールは、他のモジュールからシンボルをインポートできます。 シンボルが 1 つ以上の他のモジュールからインポートされるたびに、必要なモジュールがまだロードされていない場合、およびインポートされたシンボルが据え置きインポートとして指定されていない場合にシンボル参照を解決するために、これらのモジュールが自動的にロードされます。 これらのモジュールは、ライブラリー内のアーカイブ・メンバーにすることも、個々のファイルにすることもできます。また、モジュールがロードされる方法と場所を制御する共用ファイルまたは専用ファイルの特性を持つこともできます。
共有モジュール (通常は共有ライブラリー・アーカイブのメンバー) が共有ライブラリー領域にロードされるのは、それらのアクセス許可が共有を許可する場合、つまり、他の読み取り許可を持っている場合です。 プライベート・モジュール、および共有に必要な許可を持たない共有モジュールは、プロセスのプライベート領域にロードされます。
ローダーは、シンボルを解決するときに、そのシンボルで記録されたファイル名を使用して、そのシンボルをエクスポートするモジュールを検出します。 ファイル名に / (スラッシュ) 文字が含まれている場合は、それが直接使用され、適切なファイルまたはアーカイブ・メンバーを指定する必要があります。 ただし、ファイル名がベース名 ( / 文字を含まない) の場合、ローダーは、デフォルトのライブラリー・パスに指定されているディレクトリーで、そのベース名を持つファイル (モジュールまたはアーカイブ) を検索します。
LibraryPath は、コロンで区切られた 1 つ以上のディレクトリー・パス名を含むストリングです。 ライブラリー・パス検索については、 従属モジュールの検索 のセクションを参照してください。
プロセスが ptrace 制御下で実行されている場合、プロセスのアドレス・スペースの一部は、 ロード 処理の完了後に再コピーされます。 32 ビット・プロセスの場合、メインプログラム・テキスト (セグメント 1 にロードされる) および共用ライブラリー・モジュール (セグメント 13 にロードされる) が再コピーされます。 ブレークポイントまたはこれらのセグメントに対するその他の変更は、 ロード 呼び出しの後に再挿入する必要があります。 64 ビット・プロセスの場合、共有ライブラリー・モジュールは ロード 呼び出しの後に再コピーされます。 デバッガーは、ブレークポイントを再挿入できるように、 待機によって返される状況に SLWTED (_S) フラグを設定することによって通知されます。
ptrace 制御下で実行されているプロセスが ロードを呼び出すと、デバッガーは、 待機によって返される状況に SLWTED (_S) フラグを設定することによって通知されます。 共有ライブラリー・セグメントに新しくロードされたモジュールは、これらのセグメントのプロセスの専用コピーにコピーされます。これにより、デバッガーによる検査または変更が可能になります。
ロード サブルーチンは、新しいモジュールおよびその従属モジュールがまだロードされていない場合は、それらの初期設定ルーチン (初期化 ルーチン) を呼び出します。
このサブルーチンによってロードされたモジュールは、プロセスの終了時または EXEC サブルーチンの実行時に自動的にアンロードされます。 これらは、 アンロード サブルーチンを呼び出すことによって明示的にアンロードされます。
従属モジュールの検索
ロード操作と EXEC 操作は、従属モジュール検索メカニズムが若干異なります。 実行中のプロセス (ロード操作) のアドレス・スペースにモジュールが追加されると、次のセクションで概説されている規則を使用して、指定されたモジュールが検出されます。 依存関係はツリーとして大まかに定義できますが、モジュール間の再帰的関係も存在する可能性があることに注意してください。 以下のコンポーネントを使用して、完全なライブラリー検索パスを作成することができます。
- L_LIBPATH_EXEC フラグが設定されている場合、exec-time で使用されるライブラリー検索パス。
- LibraryPath パラメーターの値 (NULL 以外の値の場合)。 ヌル・ストリングは、現行作業ディレクトリーを参照する有効な検索パスであることに注意してください。 LibraryPath パラメーターが NULL の場合、代わりに LIBPATH 環境変数の値、または LD_LIBRARY_PATH 環境変数 ( LIBPATH が設定されていない場合) が使用されます。
- ロードされるモジュールのローダー・セクションに含まれているライブラリー検索パス ( ModuleName パラメーター)。
- 即時従属がロードされるモジュールのローダー・セクションに含まれているライブラリー検索パス。 このモジュールごとの情報は、各モジュールの直接の従属を検索するときに変更されることに注意してください。
ModuleName モジュールを見つけるには、コンポーネント 1 および 2 が使用されます。 依存項目を見つけるために、コンポーネント 1、2、3、および 4 が順番に使用されます。 既に実行中のプロセスの一部であるモジュールが、新しくロードされたモジュールの依存関係要件を満たしている場合、既存のモジュールは再度ロードされないことに注意してください。
集約検索指定のコロン区切り部分ごとに、ベース名が見つからない場合は、検索が続行されます。 さらに, 必要なファイルがアーカイブ・メンバーでない場合には, 間違ったオブジェクト・モードのファイルを超えて検索が続行されます。 アーカイブ・メンバーが必要な場合、ファイル名の最初の一致が見つかると検索は停止します。 ファイルの形式が正しくない場合、必要なアーカイブ・メンバーが含まれていないアーカイブの場合、または必要なシンボルの定義がエクスポートされない場合は、エラーが発生します。 従属モジュールに相対パス名または絶対パス名のいずれかが指定されている場合、ライブラリー・パス検索は実行されません。
モジュール内に保管されるライブラリー検索パスは、リンク・エディット時に指定されます。
ロード サブルーチンは、指定されたモジュールが非常に長い依存関係のチェーン (例えば、 lib2.aに依存し、 lib3.aに依存する lib1.aなど) を持つ場合に、呼び出しプロセスを失敗させる可能性があります。 これは、ローダーがこのような関係を固定サイズのスタックで再帰的に処理するためです。 この制限は、1000 を超えるエレメントを持つ依存関係チェーンを処理する場合にのみ明らかになります。
パラメーター
| 項目 | 説明 |
|---|---|
| ModuleName | ロードされるモジュールの名前を指します。 モジュール名は、パス名とオプションのメンバー名で構成されます。 パス名に少なくとも/文字が含まれている場合は、その名前が直接使用され、ファイルを見つけるためのディレクトリー検索は実行されません。 パス名に/文字が含まれていない場合は、ベース名として扱われ、ライブラリー・パスにリストされているディレクトリーのいずれかに含まれている必要があります。 ライブラリー・パスは、NULL 値でない場合は LibraryPath パラメーターの値、または LIBPATH 環境変数の値 (設定されている場合。設定されていない場合は LD_LIBRARY_PATH 環境変数)、またはプロセス exec 時に使用されるライブラリー・パス ( L_LIBPATH_EXEC が設定されている場合) のいずれかです。 ライブラリー・パスが指定されていない場合、モジュールは現行ディレクトリーになければなりません。 ModuleName パラメーターは、アーカイブ・メンバーを明示的に指定することができます。 構文は パス名(メンバー) です。ここで、 パス名 は前の段落で指定した規則に従い、 メンバー は特定のアーカイブ・メンバーの名前です。 括弧は指定の必須部分であり、間にスペースを入れることはできません。 アーカイブ・メンバーに名前を付ける場合は、 フラグ パラメーターに L_LOAD メンバー フラグを追加する必要があります。 それ以外の場合は、 ModuleName パラメーター全体が明示的なファイル名として扱われます。 |
| flags | load および loadAndInit サービスの動作を以下のように変更します ( ldr.h ファイルを参照)。 特別な動作が必要ない場合は、flags パラメーターの値を 0 (ゼロ) に設定してください。 互換性のために、値 1 を指定することもできます。
|
| LibraryPath | デフォルトのライブラリー検索パスを指定する文字ストリングを指します。 LibraryPath パラメーターが NULL の場合、 LIBPATH 環境変数が使用されます (設定されている場合)。それ以外の場合は、 LD_LIBRARY_PATH 環境変数が使用されます。 ライブラリー・パスは、基本名として指定された従属モジュールを見つけるために使用されます (つまり、パス名コンポーネントに/(スラッシュ) 文字が含まれていません)。 LibraryPath パラメーターをヌルに設定する場合と、 LibraryPath パラメーターがヌル・ストリング ("") を指す場合の違いに注意してください。 ヌル・ストリングは、単一のディレクトリー (現行ディレクトリー) で構成される有効なライブラリー・パスです。 |
戻り値
正常終了すると、 load および loadAndInit サブルーチンは、モジュールのエントリー・ポイントの関数へのポインターを返します。 モジュールにエントリー・ポイントがない場合は、モジュールのデータ・セクションのアドレスが戻されます。
エラー・コード
ロード および loadAndInit サブルーチンが失敗すると、NULL ポインターが戻され、モジュールはロードされず、エラーを示すために errno グローバル変数が設定されます。 ロード および loadAndInit サブルーチンは、明示的または自動的にロードされるモジュールについて、以下の 1 つ以上が該当する場合には失敗します。
| 項目 | 説明 |
|---|---|
| EACCES | ファイルが通常ファイルではないか、プログラム・ファイルのモードが実行許可を拒否しているか、パス接頭部のコンポーネントに対する検索許可が拒否されていることを示します。 |
| EINVAL | ファイルまたはアーカイブ・メンバーのヘッダーに有効なマジック・ナンバーがあるが、ヘッダーが損傷しているか、ファイルが実行されるマシンに対して正しくないことを示します。 |
| ELOOP | パス名の変換中に検出されたシンボリック・リンクが多すぎることを示します。 |
| ENOEXEC | 指定されたモジュールのシンボルをロードまたは解決するときにエラーが発生したことを示します。 これは、無効な XCOFF (X) ヘッダーを持つモジュールをロードしようとしたか、据え置きインポートとして定義されていないシンボルを解決できなかったか、またはその他のいくつかのロード時間関連の問題が原因である可能性があります。 ロード照会 サブルーチンを使用すると、ロード障害に関する詳細情報を戻すことができます。 ランタイム・リンカが使用されている場合、ランタイム・リンカがいくつかのシンボルを解決できなかった場合、loadと loadAndInitサブルーチンは失敗する。 この場合、 エラー番号 は ENOEXEC (E)に設定されますが、 ロード照会 サブルーチンは追加情報を返しません。 |
| ENOMEM | プログラムが必要とするメモリーが、システムが課した最大値で許可されているメモリーより多いことを示します。 |
| ETXTBSY | ファイルが何らかのプロセスによる書き込みのために現在オープンされていることを示します。 |
| ENAMETOOLONG | パス名のコンポーネントが 255 文字を超えているか、パス名全体が 1023 文字を超えていることを示します。 |
| ENOENT | パス接頭部のコンポーネントが存在しないか、パス名がヌル値であることを示します。 ドローペン サブルーチンの場合、アーカイブ・ファイル内のメンバーをオープンしようとするときに RTLD_MEMBER は使用されません。 |
| ENOTDIR | パス接頭部のコンポーネントがディレクトリーではないことを示します。 |
| ESTALE | プロセス・ルートまたは現行ディレクトリーが、アンマウントされた仮想ファイル・システム内にあることを示します。 |