2011-08-17 18 views
3

私は、仮想メモリのないマシン(またはより正確にはOS)のCプログラムを作成しようとしていますが、私は.rodataセクションで、あるいはより正確にそこに行くもの。問題が発生するのは、セクションがリンク時に明確に定義されたアドレスに配置されているにも関わらず、プログラムが実行に移ると再配置されるという問題です。.rodata再配置関連の質問

例:私のプログラムの開始は0x1000から開始され、実行中は0x1000にあるべきものが0xff1000に再配置されているとしましょう。

私の問題は、通常は.rodataに入るものがコンパイラ(gcc)によって「ハードコード」されていることです。再配置とgccがハードコーディングされているためにメモリ内の.rodata定数を失ってしまいます。相対アドレスの代わりに絶対オフセットを得るようにします。

.rodata定数に絶対オフセットではなく相対オフセットを持たせる方法がありますか。相対的には、アクティブなプロセスレジスタとの相対的な意味ですか?

+0

位置独立コード(GCCで '-fPIC')を生成するのと同じくらい簡単かもしれません。コードは常に '0xff1000'に再配置されるのでしょうか? – user786653

+0

可変である可能性があります。私は今、それがあなたがプログラムがこのコードをロードするかどうかは分かりません。私はこれを回避するために手動でコードを再配置する必要がありました(これは実際に私が得たはずのポイントでしたが、遠くにフェッチされ、デバッグはほとんど存在しませんでした)。 fPICに関しては、もう実際にはテストすることができませんが、-fPICコンパイルされたソースと-fPICなしの間の相互参照を行った後、それは機能しているようです(ただし、私は息を止めません。かなり奇妙なもの) – skyel

+0

あなたはどの目標フォーマットをコンパイルしていますか? .rodataはIIRCに相対アドレスを格納します。これをコードのベースアドレスに追加してそれに応じて.textセクションを更新するのは、ローダーの仕事です。私は自分自身のOSとアプリケーションローダーを書きました。それが私が覚えているものです。 – Unsigned

答えて

1

アーキテクチャによっては、.rodataが特定のメモリ領域(ROMなど)に任意に再配置される可能性があります。この種の情報は、マシンのデータシートにあります。 この場合、リンカースクリプトを使用して、右の領域に.rodataセクションを置くようにリンクに指示する必要があります。 GCCリンカスクリプトがどのように動作するかの 良い概要がここで見つけることができます:

http://www.scoberlin.de/content/media/http/informatik/gcc_docs/ld_3.html

また、あなたは簡単にインターネット上でアーキテクチャ固有のリンクスクリプトをたくさん見つけることができます。

関連する問題