LinuxカーネルのzImageを解凍する前にGDBを使ってデバッグしようとしています。カーネルはARMターゲットで実行されており、GDBサーバースタブでJTAGデバッガを接続しています。ターゲットはブートローダをロードする必要があります。ブートローダは、フラッシュからカーネルイメージを読み込み、RAMに0x20008000
とし、その場所に分岐します。Linuxカーネルのプリ解凍ステージをデバッグ
私は、私はそうのようなGDBのadd-symbol-file
コマンドを使用して、GDBを開始し、リモートターゲットに接続されています:私はそのアドレスにブレークポイントを設定すると
add-symbol-file arch/arm/boot/compressed/vmlinux 0x20008000 -readnow
、それが正しい場所でトラップを行います - 右ときカーネルに分岐します。しかし、GDBは、arch/arm/boot/compressed/head.S
のソースから間違った行を表示します。それは4行遅れです。これをどうすれば解決できますか?
add-symbol-file
に-s section addr
オプションを追加してみました。これは-s .start 0x20008000
です。この結果、まったく同じ問題が発生します。
まず、gccとgdbの互換性があることを確認してください。互換性があることを確認してください(同じツールチェーンバージョンのものが望ましい)。また、Linuxカーネルが-O2でコンパイルされているため、いくつかの行が最適化されることに注意してください。どこかの.alignキーワードがないと確信していますか? –
デコンプレッサーコードはすべてPC相対です。ある地域から別の地域に自分自身をコピーすることもできます。ブートローダーは、解凍されたターゲットがどこにあるかを入れます。それはそれ自身を動かさなければなりません。固定記号でJTAGを使って楽しい時間を過ごすつもりはないと思う。何とかGDBに*移転できるかどうかわかりません。 –