Solaris リンカーには、デバ ッギングライブラリが付いていて、これを使用するとリンク編集プロセスをより詳細に監視できます。このライブラリは、ユーザー自身のアプリケーションまたはライブラリのリンク編集を理解またはデバッグする場合に役立ちます。これは、ビジュアルエイドで、このライブラリを使用して表示される情報のタイプは、定数のままであると予期されますが、この情報の正確な形式は、リリースごとにわずかに変更される場合があります。
ELF フォーマットを熟知していないと、デバッギング出力の中には見慣れないものがあるかもしれませんが、多くのものが一般的な関心を惹くものでしょう。
デバッギングは、-D オプションを使用して実行できます。また、作成された出力はすべて標準エラーに直接送信されます。このオプションは、1 つまたは複数のトークンで拡張し、必要なデバッギングのタイプを指示する必要があります。使用できるトークンは、-Dhelp を使用して表示できます。次に例を示します。
$ ld -Dhelp debug: debug: For debugging the link-editing of an application: debug: LD_OPTIONS=-Dtoken1,token2 cc -o prog ... debug: or, debug: ld -Dtoken1,token2 -o prog ... debug: where placement of -D on the command line is significant debug: and options can be switched off by prepending with `!'. debug: debug: debug: args display input argument processing debug: basic provide basic trace information/warnings debug: detail provide more information in conjunction with other debug: options debug: entry display entrance criteria descriptors debug: files display input file processing (files and libraries) debug: help display this help message debug: libs display library search paths; detail flag shows actual debug: library lookup (-l) processing debug: map display map file processing debug: move display move section processing debug: reloc display relocation processing debug: sections display input section processing debug: segments display available output segments and address/offset debug: processing; detail flag shows associated sections debug: support display support library processing debug: symbols display symbol table processing; debug: detail flag shows resolution and linker table addition debug: versions display version processing debug: got display GOT symbol information |
このリストは、一例で、リンカーに有用なオプションを表示しています。正確なオプションは、リリースごとに異なる場合があります。
ほとんどのコンパイラドライバは、-D オプションの解釈をその前処理フェーズ中に行うため、リンカーにこのオプションを渡すためには、LD_OPTIONS
環境変数のメカニズムが適しています。
次の例では、入力ファイルの監視方法を示しています。これは、特に、リンク編集中に、配置されたライブラリ、またはアーカイブから抽出された再配置可能オブジェクトを判別する場合に有用です。
$ LD_OPTIONS=-Dfiles cc -o prog main.o -L. -lfoo ............ debug: file=main.o [ ET_REL ] debug: file=./libfoo.a [ archive ] debug: file=./libfoo.a(foo.o) [ ET_REL ] debug: file=./libfoo.a [ archive ] (again) ............ |
ここでは、prog のリンク編集を満足させるために、構成要素 foo.o がアーカイブライブラリ libfoo.a から抽出されています。foo.o の抽出が、その他の再配置可能オブジェクトの抽出を認めていないことを検証するために、このアーカイブが 2 回 (again) 検索されていることに注意してください。(again) が複数表示されていることによって、このアーカイブが lorder(1) と tsort(1) を使用した並び替えの候補になっていることがわかります。
シンボル トークンを使用することにより、どのシンボルによってアーカイブ構成要素が抽出されたか、また、最初のシンボルリファレンスを実行したオブジェクトを判別できます。
$ LD_OPTIONS=-Dsymbols cc -o prog main.o -L. -lfoo ............ debug: symbol table processing; input file=main.o [ ET_REL ] ............ debug: symbol[7]=foo (global); adding debug: debug: symbol table processing; input file=./libfoo.a [ archive ] debug: archive[0]=bar debug: archive[1]=foo (foo.o) resolves undefined or tentative symbol debug: debug: symbol table processing; input file=./libfoo(foo.o) [ ET_REL ] ............. |
ここでは、シンボル foo は、main.o によって参照され、リンカーの内部シンボルテーブルに付加されます。このシンボルリファレンスによって、再配置可能オブジェクト foo.o が、アーカイブ libfoo.a から抽出されます。
この出力は、このマニュアル用に簡素化したものです。
detail トークンを、シンボルトークンとともに使用すると、入力ファイル処理中のシンボル解析を監視できます。
$ LD_OPTIONS=-Dsymbols,detail cc -o prog main.o -L. -lfoo ............ debug: symbol table processing; input file=main.o [ ET_REL ] ............ debug: symbol[7]=foo (global); adding debug: entered 0x000000 0x000000 NOTY GLOB UNDEF REF_REL_NEED debug: debug: symbol table processing; input file=./libfoo.a [ archive ] debug: archive[0]=bar debug: archive[1]=foo (foo.o) resolves undefined or tentative symbol debug: debug: symbol table processing; input file=./libfoo.a(foo.o) [ ET_REL ] debug: symbol[1]=foo.c ............. debug: symbol[7]=bar (global); adding debug: entered 0x000000 0x000004 OBJT GLOB 3 REF_REL_NEED debug: symbol[8]=foo (global); resolving [7][0] debug: old 0x000000 0x000000 NOTY GLOB UNDEF main.o debug: new 0x000000 0x000024 FUNC GLOB 2 ./libfoo.a(foo.o) debug: resolved 0x000000 0x000024 FUNC GLOB 2 REF_REL_NEED |
ここでは、main.o からの、オリジナルの未定義シンボル foo が、アーカイブ構成要素 foo.o から抽出されたシンボル定義で上書きされます。このシンボルの詳細情報は、各シンボルの属性に反映されます。
上記の例からわかるように、デバッギングトークンのいくつかを使用すると、豊富な出力が作成されます。入力ファイルのサブセットにかかわるアクティビティだけに関心がある場合には、-D オプションを、リンク編集コマンド行内に直接配置し、オンとオフを切り替えます。次に例を示します。
$ ld .... -o prog main.o -L. -Dsymbols -lbar -D!synbols .... |
ここでは、シンボル処理の表示がオンになるのは、ライブラリ libbar の処理中だけです。
リンク編集コマンド行を入手するには、使用しているドライバからコンパイル行を拡張する必要があります。詳細については、「コンパイラドライバを使用する」を参照してください。