3

仮想メモリ(またはより正確にはOS)のないマシン用のCプログラムを作成しようとしていますが、.rodataセクション、またはより正確にはそこにあるものでいくつかの問題に直面しています。リンク中にセクションが適切に定義されたアドレスに配置されていても、プログラムが実行されると、セクションが再配置されるという問題が発生します。

例: 私のプログラムの開始が 0x1000 で開始するようにリンクされているとしましょう。実行中に、0x1000 にあるはずのものが 0xff1000 に再配置されます。

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

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

4

1 に答える 1

1

アーキテクチャによっては、.rodata が任意に特定のメモリ領域 (たとえば ROM) に再配置される可能性があります。この種の情報は、マシンのデータシートに記載されています。この場合、リンカー スクリプトを使用して、.rodata セクションを適切な領域に配置するようにリンクに指示する必要があります。GCC リンカー スクリプトがどのように機能するかの概要は、次の場所にあります。

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

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

それが役に立ったことを願っています!

于 2013-01-24T13:36:17.900 に答える