HP OpenVMS Systems Documentation |
| 前へ | 次へ | 目次 | 索引 |
LBR$REPLACE_KEY ルーチンは,ライブラリのキーの変更または追加を行います。
LBR$REPLACE_KEY library_index ,key_name ,oldrfa ,newrfa [,flags]
OpenVMS 用法: cond_value データ型: ロングワード (符号なし) アクセス: 書き込み専用 受け渡し方: 値渡し
ロングワードの状態値。大部分のユーティリティ・ルーチンは,状態値を返します。このルーチンから戻される状態値は,「戻される状態値」の項に示します。
library_index
OpenVMS 用法: longword_unsigned データ型: ロングワード (符号なし) アクセス: 読み取り専用 受け渡し方: 参照渡し
LBR$INI_CONTROL ライブラリ・ルーチンから返されたライブラリ制御インデックス。引数 library_index は,インデックスが格納されたロングワードのアドレスです。key_name
OpenVMS 用法: char_string データ型: 文字列 アクセス: 読み取り専用 受け渡し方: 参照渡し
ライブラリで ASCII キーが使われている場合には,引数 key_name は,キーの文字列記述子のアドレスです。ライブラリでバイナリ・キーが使われている場合には,引数 key_name は,キーの値が格納された符号なしロングワードのアドレスです。
oldrfa
OpenVMS 用法: vector_longword_unsigned データ型: ロングワード (符号なし) アクセス: 読み取り専用 受け渡し方: 参照渡し
元のレコード・ファイル・アドレス (RFA)。引数 oldrfa は,置換しようとしているキーに関連付けられたモジュール・ヘッダの元の RFA (LBR$LOOKUP_KEY で返される) が格納された 2 つのロングワードからなる配列のアドレスです。newrfa
OpenVMS 用法: vector_longword_unsigned データ型: ロングワード (符号なし) アクセス: 読み取り専用 受け渡し方: 参照渡し
新しい RFA。引数 newrfa は,新しいキーに関連付けられたモジュール・ヘッダの RFA (LBR$PUT_RECORD で返される) が格納された 2 つのロングワードからなる配列のアドレスです。flags
OpenVMS 用法: mask_longword データ型: ロングワード (符号なし) アクセス: 読み取り専用 受け渡し方: 参照渡し
指定した場合には,置換するキーの型を示します。フラグ・ビットの意味は,次のとおりです。
フラグ・ビット 意味 LBR$M_SYM_WEAK = 0x1 UNIX スタイルの弱いシンボル属性 LBR$M_SYM_GROUP = 0x2 グループ・シンボル属性
このパラメータを指定しない場合には,NonGroup-Global を指定したものと見なされます。この場合には,すべての型のリストが検索され,対応するエントリが削除されます。新しいシンボルが,newrfa を定義モジュールとする,新しい NonGroup-Global 定義として格納されます。
このパラメータを指定した場合には,このパラメータは置換するシンボルの型のフラグを表わします。置換は元の位置で行われ,型リスト内での位置は変わりません。このルーチンを呼び出したときにシンボルが存在しなかった場合には,新しい定義は,指定した型の型リストの最後に付け加えられます。
これで異なるシンボル定義型が存在することになりますが,古いキーと新しいキーで定義型が異なる場合には,LBR$DELETE_KEY ルーチンを使った後で LBR$INSERT_KEY ルーチンを使うことをお勧めします。
LBR$REPLACE_KEY は,現在のインデックス内にキーを検出できなかった場合には,LBR$INSERT_KEY ルーチンを呼び出して,キーを追加します。 LBR$REPLACE_KEY がキーを検出した場合には,インデックスのキー・エントリが新しいモジュール・ヘッダを指すように変更します。
LBR$_ILLCTL 指定したライブラリ制御インデックスは無効。 LBR$_INVRFA 指定した RFA は無効。 LBR$_LIBNOTOPN 指定したライブラリは,オープンされていない。
LBR$SEARCH ルーチンは,指定したデータを指すインデックス・キーを検索します。
LBR$SEARCH library_index ,index_number ,rfa_to_find ,routine_name [, flags]
OpenVMS 用法: cond_value データ型: ロングワード (符号なし) アクセス: 書き込み専用 受け渡し方: 値渡し
ロングワードの状態値。大部分のユーティリティ・ルーチンは,状態値を返します。このルーチンから戻される状態値は,「戻される状態値」の項に示します。
library_index
OpenVMS 用法: longword_unsigned データ型: ロングワード (符号なし) アクセス: 読み取り専用 受け渡し方: 参照渡し
LBR$INI_CONTROL ライブラリ・ルーチンから返されたライブラリ制御インデックス。引数 library_index は,インデックスが格納されたロングワードのアドレスです。index_number
OpenVMS 用法: longword_unsigned データ型: ロングワード (符号なし) アクセス: 読み取り専用 受け渡し方: 参照渡し
ライブラリのインデックス番号。引数 index_number は,検索対象のインデックス番号が格納されたロングワードのアドレスです。rfa_to_find
OpenVMS 用法: vector_longword_unsigned データ型: ロングワード (符号なし) アクセス: 書き込み専用 受け渡し方: 参照渡し
キーを検索するモジュールのレコード・ファイル・アドレス (RFA)。引数 rfa_to_find は,モジュール・ヘッダの RFA (前もって,LBR$LOOKUP_KEY または LBR$PUT_RECORD で返される) が格納された 2 つのロングワードからなる配列のアドレスです。routine_name
OpenVMS 用法: procedure データ型: プロシージャ値 アクセス: 読み取り専用 受け渡し方: 参照渡し
キーを処理するユーザ定義ルーチンの名前。引数 routine_name は,RFA を持つキー・エントリ (すなわち,同じモジュール・ヘッダを指すキー) が見つかるたびに呼び出すユーザ定義ルーチンのプロシージャ値のアドレスです。このユーザ定義ルーチンでは,LBR$DELETE_KEY や LBR$INSERT_KEY を呼び出すことはできません。
flags
OpenVMS 用法: mask_longword データ型: ロングワード (符号なし) アクセス: 読み取り専用 受け渡し方: 参照渡し
この引数を指定していて,0 でない場合には,指定したキーの型,またはすべての型を示します。フラグ・ビットの意味は,次のとおりです。
フラグ・ビット 意味 LBR$M_SYM_WEAK = 0x1 UNIX スタイルの弱いシンボル属性 LBR$M_SYM_GROUP = 0x2 グループ・シンボル属性 LBR$M_SYM_ALL = 0x80000000 すべてのシンボル
ユーザ・ルーチンには,追加された 3 番目のパラメータで,シンボルの型が渡されます。
ライブラリ・インデックスで,指定された RFA を持つシンボルを検索し,そのシンボルに対してユーザ定義ルーチンを呼び出します。LBR$SEARCH を使うと,同じモジュール・ヘッダを指しているインデックス・キーが検索できます。通常,インデックス番号 1 (モジュール名テーブル) では,1 つのキーだけが特定のモジュールを指しています。したがって,このルーチンは,複数のキーが 1 つのモジュールを指している場合にライブラリ・インデックスを検索するために使います。たとえば,オブジェクト・ライブラリ内の 1 つのオブジェクト・モジュールに関連付けられたシンボルを,シンボル・インデックス内ですべて見つけるために,LBR$SEARCH を呼び出します。
LBR$SEARCH は,指定された RFA に関連付けられたインデックス・キーを検出した場合には,以下の 3 つの引数を渡してユーザ定義ルーチンを呼び出します。
- キー引数。次のいずれかのアドレスです。
- キーの名前に対応した文字列記述子 (ASCII のキー名を持つライブラリ)
- キーの値に対応した符号なしロングワード (バイナリ・キーを持つライブラリ)
- RFA 引数。モジュール・ヘッダの RFA が格納された 2 つのロングワードからなる配列のアドレスです。
- キーの型。各フラグ・ビットの意味は次のとおりです。
フラグ・ビット 意味 LBR$M_SYM_WEAK = 1 UNIX スタイルの弱いシンボルの属性 LBR$M_SYM_GROUP = 2 グループ・シンボルの属性
ユーザ・ルーチンは,正常終了,または異常終了を示す戻り値を返す必要があります。ユーザ・ルーチンが偽の値 (最下位ビット = 0) を返した場合には,インデックスの検索を中止します。
LBR$SEARCH が検出したキーは,ユーザ定義ルーチンを呼び出している間だけ有効です。このキーを後で使用する場合は,コピーしておく必要があります。
LBR$_ILLCTL 指定したライブラリ制御インデックスは無効。 LBR$_ILLIDXNUM 指定したライブラリ・インデックス番号は無効。 LBR$_KEYNOTFND ライブラリ・ルーチンは指定した RFA のキーを検出できなかった。 LBR$_LIBNOTOPN 指定したライブラリは,オープンされていない。
4.8.6 新しい UNIX スタイルの弱いシンボルの導入によるライブラリ形式の変更
Intel C++ コンパイラの要件に従うため,ライブラリの形式は,新しい UNIX スタイルの弱いシンボルに対応するように拡張されました。新しい UNIX スタイルの弱いシンボルのキー名が一致している複数のモジュールが,同じライブラリ内に存在できるようになりました。 Librarian ユーティリティは,OpenVMS スタイルの弱いシンボルの定義は,従来どおり,無視します。
UNIX スタイルの弱いシンボルの定義は,OpenVMS での弱い転送アドレスと同様の働きをします。すなわち,それらのシンボルの定義は一時的です。リンク操作時に,より強力なバインディング・タイプの定義が見つからなかった場合に,一時的な定義が最終的な定義になります。
4.8.6.1 弱いシンボルのための新しい ELF タイプ
2 種類の弱いシンボルの定義を区別するために,新しい ELF (Executable and Linkable Format) タイプが作られました。
バージョンが 2 以上の ABI を持つモジュールの場合に,次のタイプが追加されました。
Librarian は,同じライブラリ内で, ELF ABI のバージョン 1 とバージョン 2 の両方のオブジェクト・ファイル形式とイメージ・ファイル形式をサポートしています。
新しいライブラリ形式 (Version 6.0) は,ELF のオブジェクト・ライブラリと共有イメージ・ライブラリに対してだけ適用されます。他のライブラリは,Version 3.0 のままです。 |
新しい Version 6.0 のライブラリを使うことをお勧めします。
ただし,新しいライブラリ・インデックス形式では,LBR ルーチンは, Version 3.0 と Version 4.0 の ELF のオブジェクト・ライブラリと共有イメージ・ライブラリを読み取り専用モードでオープンします。そのため,そのライブラリを LBR ルーチンや Librarian ユーティリティで変更することはできません。ただし,次の LIBRARY コマンドを使うと,旧バージョンのライブラリを Version 6.0 のライブラリに変換できます。
$ LIBRARY/COMPRESS library-name |
Librarian ユーティリティを使って,Version 3.0,Version 4.0 と Version 5.0 の ELF のオブジェクト・ライブラリや共有イメージ・ライブラリを変更しようとすると, Librarian はこれらのライブラリを自動的に Version 6.0 のライブラリに変換します。
ライブラリを少なくとも Version 6.0 レベルのライブラリ形式に変換すると,旧バージョンのライブラリ・ルーチンや Librarian ユーティリティではアクセスできなくなります。アクセスしようとすると,LBR$_UNSUPLVL ステータスが返され, Librarian ユーティリティは次のメッセージを表示します。
|
シンボルは,GROUP と呼ばれる ELF エンティティ内に含まれるセクションに関連付けることができます。これらのグループとそれに関連付けられるシンボルは,新しい UNIX スタイルの弱いシンボルの定義と同様の働きをします。すなわち,一時的な定義として扱われます。ライブラリではこれらのタイプのシンボルに対して,ライブラリのシンボル名インデックス内に複数のシンボル定義を許すようになりました。
4.8.6.4 優先順位規則
次に示すリストでは,GROUP 属性と UNIX スタイルの WEAK 属性が組み合わされたシンボルの型について,優先順位が高い型から低い型の順で説明します。これらのシンボルの型では,シンボルの結合の順番は,追加された時期に応じて,古いものから新しいものへの順番になります。この順番は重要です。 OpenVMS I64 Linker は,ライブラリからのシンボルの解決を求める際に,優先順位が最も高いシンボルで最も早く追加されたモジュールのインスタンスを受け取るからです。
| 前へ | 次へ | 目次 | 索引 |