2013-12-11 11 views
14

カーネルを書いたとき、私は、私が持っているリンカの問題をデバッグしようとしています。リンカースクリプト:デバッグのための戦略?

問題は、私は、私が使用することはできませんよ変数SCAN_CODE_MAPPINGを持っているということである - 空か何かのように見えます。プログラムをリンクする方法を変更することでこれを修正できますが、理由はわかりません。

objdumpを使って生成されたバイナリファイルを見ると、その変数のデータは確かにそこにあります。そのため、参照が壊れているだけです。リンカスクリプトと二つのファイル間で異なるのシンボルテーブルの一部の両方を持つ

Here's a gist。私を混乱させる何

は、シンボルテーブルの両方がすべて同じ符号を持っている、彼らはすべて同じ長さだし、彼らは右のデータが含まれているように見えるということです。私が見ることができる唯一の違いは、彼らは同じ順序ではないということです。

は、これまでのところ私はそれは私が期待したデータを持っており、ゼロにされていないことを確認するためにSCAN_CODE_MAPPINGメモリ位置を検査

  • 試してみた
  • すべてのシンボルが同じ
  • であることを確認します
  • すべてのシンボルの内容は、それがデータのアドレスを持っていることを確認する.data.rel.ro.localを見て、同じ長さ
  • であることを確認し
私は壊れたし、正しい場合の両方で取得

warning: uninitialized space declared in non-BSS section `.text': zeroing

一つの可能​​な手掛かりは、この警告です。

私は次は何を試してみてください?

+0

投票助けをデバッグすると閉じます。 –

答えて

3

「readelf」を使用すると、さらに詳しい情報を得ることができます。

は特に、プログラムヘッダを見てみましょう:

readelfが-lプログラム

あなたのBSSセクションは、おそらく警告を引き起こし標準のものよりもかなり異なっています。ここではデフォルトが私のシステム上で次のようになります。入力セクションは、あなたのリンカスクリプトには何も一致しない場合

.bss   : 
    { 
    *(.dynbss) 
    *(.bss .bss.* .gnu.linkonce.b.*) 
    *(COMMON) 
    /* Align here to ensure that the .bss section occupies space up to 
     _end. Align after .bss to ensure correct alignment even if the 
     .bss section disappears because there are no input sections. 
     FIXME: Why do we need it? When there is no .bss section, we don't 
     pad the .data section. */ 
    . = ALIGN(. != 0 ? 64/8 : 1); 
    } 

、リンカは、まだどこかに配置することがあります。すべての入力セクションをカバーしていることを確認してください。

セクションとセグメントには違いがあります。セクションはリンカーによって使用されますが、プログラムローダーが見るのはセグメントのみです。テキストセグメントにはテキストセクションが含まれますが、その他のセクションも含まれます。同じセグメントに入るセクションは隣接している必要があります。だから順序は重要です。

rodataセクションは、通常、テキストセクションの後に続きます。これらは両方とも実行時に読み取り専用であり、プログラムのヘッダーにLOADエントリとして1度表示され、読み取りアクセス権は&です。そのLOADエントリはテキストセグメントです。

通常、bssセクションはデータセクションの後にあります。これらは両方とも実行時に書き込み可能であり、プログラムのヘッダにLOADエントリとして一度表示され、書き込みの許可は&となります。そのLOADエントリはデータセグメントです。

注文を変更すると、リンカーがプログラムヘッダーを生成する方法に影響します。セクションヘッダーではなくプログラムヘッダーは、実行前にプログラムをロードするときに使用されます。カスタムリンカースクリプトを使用する場合は、プログラムヘッダーを確認してください。

あなたの実際の症状が何であるかについて詳しく知ることができれば、助けがさらに簡単になります。

+0

これは私が抱えていた問題ではありませんでした(私はカーネルを書いていたので、最終実行ファイルの構造はそれほど問題になりませんでした)。しかし、とにかく役に立つ情報。 – jvns

5

ここでの問題は、私がOSを書いていることが判明し、そのうち12kだけが全部ではなく読み込まれていたことが分かりました。リンカースクリプトは実際にうまくいきました。

私はバイナリを理解するために使用される主なツールは以下の通りであった。

  • objdumpの
    • nmのreadelfが
  • 関連する問題