dbx コマンドによるデバッグ

完全再リンクの要因

ild のリンク委嘱メッセージ

ild: calling ld to finish link ...」というメッセージは、ild がリンクを完了できないため、リンク要求を ld に依頼して完了させることを意味します。

デフォルトでは、必要に応じて以下のようなメッセージが表示されるように設定されています。これらのメッセージは、-z i_quiet オプションによって非表示にすることができます。

ild: ld を呼び出してリンクを完了させます -- アーカイブ <library name> 中の共有ライブラリを処理できません

このメッセージは、ild が潜在的に要求されている場合 (-g が使用されている場合) は表示されませんが、明らかに -xildon がコマンド行に指定されていると表示されます。また、-z i_verbose オプションを使用すると、どのような場合も必ず表示され、逆に -z i_quiet オプションを使用すると、どのような場合も表示されなくなります。

ild: ld を呼び出してリンクを完了させます -- キーワード <keyword> を処理できません

ild: ldを呼び出してリンクを完了させます -- オプション -d <keyword> を処理できせん

ild: ldを呼び出してリンクを完了させます -- オプション -z <keyword> を処理できせん

ild: ldを呼び出してリンクを完了させます -- 引数 <keyword> を処理できません

ild の再リンクメッセージ

「ild:(完全な再リンク中) ...」というメッセージは、何らかの理由で ild がインクリメンタルリンクを実行できず、完全再リンクを行う必要があることを意味します。これはエラーではありません。インクリメンタルリンクよりもリンクに時間がかかることを通知するためのメッセージです。詳細については、ild の動作」を参照してください。ild メッセージは、ild オプションの -z i_quiet-z i_verbose で制御できます。メッセージの中には、より説明的な文章を表示する冗長 (verbose) モードに変換できるものもあります。

これらのメッセージはすべて、ild オプションの -z i_quiet を使用して非表示にすることができます。デフォルトのメッセージが冗長モードで表示できる場合は、メッセージの末尾に「...」という省略符号が表示され、さらに詳しい情報が表示できることを示します。補足情報を表示するには、-z i_verbose オプションを使用します。この項のメッセージ例は、-z i_verbose オプションを指定することによって表示されたものです。

例 1: 内部空領域が使い果たされた場合

完全再リンクメッセージの最も一般的なものは、次のような「internal free space exhausted」メッセージで、内部空領域が使い果たされたことを意味するものです。

# test1.o を作成します。

# 最小限のデバッグ情報を含む a.out を
作成します。

# 1 行目のコンパイルとリンクを行い、
すべてのデバッグ情報を a.out に保存します。
$ cat test1.c 
int main() { return 0; }
$ /bin/rm -f a.out
$ cc -xildon -c -g test1.c
$ cc -xildon -z i_verbose -g test1.o
$ cc -xildon -z i_verbose -g test1.c
ild: (完全な再リンク中) 出力ファイルの内部
空き領域を使い果たしました (セクション)
$

上記のコマンドは、1 行目のコンパイルから 2 行目のコンパイルに移行したことにより、実行可能ファイルのサイズがデバッグ情報で肥大したことを示しています。このサイズの肥大により、内部の空領域が不足したため、ild は完全再リンクを実行します。

例 2: strip を実行した場合

strip コマンドを実行した場合もエラーが発生します。例 1 に続いて、次のようなコマンドを実行すると、エラーメッセージが表示されます。

# a.out を strip します。

# インクリメンタルリンクの
実行を試みます。
$ strip a.out
$ cc -xildon -z i_verbose -g test1.c
ild: (完全な再リンク中) a.out は最後にインクリ
メンタルリンクを実行してから変更されていま
す -- strip または mcs を実行したと思われます
$

例 3: ild バージョンが異なる場合

古いバージョンの ild で作成された実行可能ファイルで、新しいバージョンの ild を実行すると、次のようなエラーメッセージが表示されます。

# old_executable ファイルが
旧バージョンの ild で作成されたものと
仮定します。
$ cc -xildon -z i_verbose foo.o -o old_executable
ild: (完全な再リンク中) a.out が最後にリンクされた時点 
(206/3145777) 以降に、更新された ild がインストールされ
ています


注 -

(2/16) という数値は、内部レポート用としてのみ使用されています。


例 4: 変更ファイルが多すぎる場合

ild は、インクリメンタルリンクを実行するよりも、完全再リンクを実行する方が速いと判断する場合があります。たとえば、次のような場合です。

$ rm a.out
$ cc -xildon -z i_verbose x0.o x1.o x2.o x3.o x4.o x5.o x6.o x7.o x8.o test2.o
$ touch x0.o x1.o x2.o x3.o x4.o x5.o x6.o x7.o x8.o
$ cc -xildon -z i_verbose x0.o x1.o x2.o x3.o x4.o x5.o x6.o x7.o x8.o test2.o
ild:  (完全な再リンク中) 変更されたファイルが多すぎます

この例では、touch コマンドを使用したことによって x0.ox8.o のファイルが変更されており、それを認識した ild が、これら 9 つのオブジェクトファイルをすべてインクリメントしながら再リンクするよりも、完全再リンクを行った方が速いと判断しています。

例 5: 前のリンクが完全再リンクだった場合

前回のリンクが完全再リンクになった場合は、そのリンクと比較して、次に行うリンクも完全再リンクになる可能性があります。

前回のプログラムを再びリンクしようとすると、次のようなメッセージが表示されます。

# ild は前回のエラーを検出
したため、完全再リンクを行います。
$ cc -xildon -z i_verbose broken.o
ild:(完全な再リンク中) 以前のリンクに
問題があったので、インクリメンタルモードでは
再リンクできません

この場合は、完全再リンクが行われます。

例 6: 新しい作業ディレクトリを使用する場合

 
% cd /tmp
% cat y.c
int main(){ return 0;}
% cc -c y.c
% rm -f a.out
# 現在のディレクトリ /tmp で最初のリンクを行います。
% cc -xildon -z i_verbose y.o -o a.out
 
% mkdir junk
% mv y.o y.c a.out junk/.
% cd junk
# ディレクトリを /tmp/junk に変更して
から、インクリメンタルリンクを行います。
% cc -xildon -z i_verbose y.o -o a.out
ild:  (完全な再リンク中) 現在の
ディレクトリが `/tmp' から `/tmp/junk' に変更されています
%