プログラム中でエラー検査がオンになっていて、プログラムが実行中の場合、次のエラーが検出されることがあります。
librtc.so と dbx とのバージョンが合いません。; エラー検査を休止状態にしました
これは、RTC を接続されたプロセスに使用していて、LD_PRELOAD を、各自の Sun WorkShop dbx に添付されたもの以外の librtc.so バージョンに設定した場合に起こる可能性があります。これを修正するには、LD_PRELOAD の設定値を変更してください。
パッチエリアが遠すぎます (8MB の制限); アクセス検査を休止状態にしました
RTC は、アクセス検査を有効にするためにロードオブジェクトに十分に近いパッチスペースを検出できませんでした。この章に後述される「rtc_patch_area」の項を参照してください。
アクセス検査を実行するために、dbx の RTC 機能は各ロードおよびストア命令を、パッチ領域への分岐命令と置き換えます。この分岐命令の有効範囲は 8Mバイトです。これは、デバッグされたプログラムが、置き換えられた特定のロード/ストア命令の 8Mバイトのアドレス空間をすべて使いきってしまった場合、パッチ領域を保存する場所がなくなることを意味します。
RTC がメモリーへのすべてのロードおよびストアにまったく割り込めない場合、RTC は正確な情報を提供できないので完全に無効になります。リークのチェックは影響を受けません。
この制約にぶつかった場合、dbx は何らかの処置を施します。その結果、問題が修正できれば続行しますが、問題が修正できない場合は、エラーメッセージを表示しアクセス検査を終了します。
dbx には、8Mバイトの限界に達したユーザーのために、いくつかの回避策が用意されています。これらの回避策では、SUN WorkShop に含まれる rtc_patch_area と呼ばれるユーティリティを使用する必要があります。
このユーティリティは、ユーザーのプログラムにリンク可能なオブジェクトファイルまたは共有オブジェクトファイルを作成し、RTC が使用するパッチ領域を作成します。
実行可能イメージ内のすべてのロードおよびストア命令から 8Mバイト以内で、dbx がパッチ領域を見つけられない場合、考えられる原因は次の 2 つです。
ケース 1: 静的にリンクされた a.out ファイルが大きすぎる。
ケース 2: 動的にリンクされた共有ライブラリ (1 つ以上) が大きすぎる。
dbx はこの限界に達すると、どのくらいのパッチ領域が必要かを示すメッセージを出力して、該当するケース (ケース 1 または 2) を指示します。
ケース 1 では、rtc_patch_area を使用して、パッチ領域として機能する 1 つまたは複数のオブジェクトファイルを作成し、それらを a.out にリンクすることができます。
次のようなメッセージが表示されたら、以下の手順に従ってください。
実行時検査を有効にしています... dbx: warning: rtc: cannot find patch space within 8Mb (need 6490432 bytes for ./a.out)
dbx: patch area too far (8Mb limitation); Access checking disabled
(See `help rtc8M', case 1)
サイズが 8Mバイト以下のオブジェクトファイル patch.o をパッチ領域として作成します。
rtc_patch_area -o patch.o -size 6490432
-size フラグは任意指定です。デフォルト値は 8000000 です。
エラーメッセージからのサイズ要求を満たしたら、次の手順に進みます。それ以外の場合は、手順 1 を繰り返して、さらに多くの .o ファイルを必要に応じて作成します。
a.out を再リンクして、patch.o ファイルをリンク行に追加します。
RTC を新しいバイナリで再試行します。
それでも RTC が失敗する場合は、リンク行上の patch.o ファイルを再配置することができます。
代替手段として、a.out をより小さい a.out と共有ライブラリに分割する方法があります。
RTC を接続されたプロセスで実行する場合は、ケース 2a を参照してください。それ以外の場合、唯一の対策は、余分なパッチスペースを持つ共有ライブラリの再作成です。
次のようなメッセージが表示されたら、以下の手順に従ってください。
実行時検査を有効にしています... dbx: warning: rtc: cannot find patch space within 8Mb (need 563332 bytes for ./sh1.so)
dbx: patch area too far (8Mb limitation); Access checking disabled
(See `help rtc8M', case 2)
サイズが 8Mバイト以下のオブジェクトファイル patch.o をパッチ領域として作成します。
rtc_patch_area -o patch.o -size 563332
-size フラグは任意指定です。デフォルト値は 8000000 です。
エラーメッセージからのサイズ要求を満たしたら、次の手順に進みます。それ以外の場合は、手順 1 を繰り返して、さらに多くの .o ファイルを必要に応じて作成します。
sh1.so を再リンクして、patch.o ファイルをリンク行に追加します。
RTC を新しいバイナリで再試行します。dbx が、別の共有ライブラリに対してパッチスペースを要求する場合は、そのライブラリについて、手順 1 〜 手順 2 を繰り返します。
ケース 2a では、dbx によって要求される共有ライブラリのパッチスペースが 8Mバイト以下の場合、rtc_patch_area を使用して、パッチ領域として機能する共有ライブラリを作成し、それを a.out にリンクすることができます。
次のようなメッセージが表示されたら、以下の手順に従ってください。
実行時検査を有効にしています... dbx: warning: rtc: cannot find patch space within 8Mb (need 563332 bytes for ./sh1.so)
dbx: patch area too far (8Mb limitation); Access checking disabled
(See `help rtc8M', case 2)
共有オブジェクト patch1.so をパッチ領域として作成します。
rtc_patch_area -so patch1.so -size 563332
-size フラグは任意指定です。デフォルト値は 8000000 です。
リンク行で sh1.so の隣に patch1.so を置いてプログラムを再リンクします。dbx が同じ sh1.so に対してさらにパッチスペースを要求する場合は、patch1.so を sh1.so の直前に入れてみてください。
必要な共有ライブラリ順序を得るには、ld -l オプションではなくフルパス名を使用する必要があります。
新しいバイナリで RTC を再試行します。dbx が、別の共有ライブラリに対してパッチスペースを要求する場合は、そのライブラリについて手順 1〜2 を繰り返します。
dbx によって要求されるパッチスペースが、指定の共有ライブラリごとに 8Mバイトを超える場合は、上記のケース 2 の手順に従ってください。
rtc_patch_area は、オブジェクトファイルや共有ライブラリファイルを作成するシェルスクリプトです。これらのファイルを使用してユーザーのプログラムにリンクし、大きなテキスト、データ、または bss イメージを使用するプログラムにパッチ領域を追加することができます。
作成されるオブジェクトファイル (共有ライブラリ) には、指定サイズ、または指定しなかった場合は 8000000 の RTC パッチ領域が含まれます。
結果のオブジェクトファイル (または共有ライブラリ) の名前は、標準出力に書き込まれます。-o または -so オプションのいずれかを使用する必要があります。
作成する共有ライブラリの名前を指定します。この名前は標準出力に書き込まれます。
-so sharedlibname
作成するオブジェクトファイルの名前を指定します。この名前は標準出力に書き込まれます。
-o objectname
size バイトのパッチ領域を作成します (デフォルト値で、かつ適切な最大値は 8000000 です)。
-size size
cc または acc の代わりに compiler を使用してオブジェクトファイルを構築します。
-cc compiler
標準の 8Mバイトのパッチ領域のオブジェクトファイルを作成します。
rtc_patch_area -o patch.o
100,000 バイトのパッチを含むオブジェクトファイルを作成します。
rtc_patch_area -size 100000 -o patch.o
rtc_patch_area -so rtc1M.so -size 1000000