問題タブ [position-independent-code]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
2 に答える
331 参照

gcc - 最初に 16($fp) に格納せずに、MIPS GCC が関数呼び出し (GOT ポインター) の後に 16($fp) から $28 をリロードするのはなぜですか?

長く見えますが、コード全体を貼り付ける必要があると思います。

テスト用の簡単なコードを書きます。

組み立て後:

各関数呼び出しの後に、lw $28,16($fp)命令があることに気付きました。しかし、呼び出し元または呼び出し先のいずれかに最初に値を格納するコードは見当たりません。

MIPS アセンブリを読み取ることができます。lwそれがロード ワードであり、$fp と $sp がフレーム ポインターとスタック ポインターであることはわかっています。

から何かをロードすることがどのように理にかなっているのか理解できません16($fp)。初期化されていないスペースがあるようです。

私は知って$28おり$gp、呼び出しの前に関数アドレスをロードするためのGOTポインターとして使用されていることがわかりますが、関数で使用される前にそのレジスタを初期化するものは何もないようです。

MIPS 呼び出し規則$28では、関数のエントリで GOT を既に指している必要がありますか?

0 投票する
0 に答える
153 参照

gcc - コードの位置に依存しないコードをコンパイルし、データの位置に依存するコードをコンパイルするように gcc を構成できますか?

QSPI の 2 つの異なる場所で実行できる ARM M7 ベースの組み込みシステム用の起動可能なコードを構築しようとしています。別の場所。

-fpic を指定してコンパイルすると、両方の場所で (ほぼ) 正常に実行できる再配置可能なコード イメージが生成されるようです。ただし、問題は、コードが参照する data/bss同じ量だけオフセットされていることです。つまり、コンパイラは、.data および .bss セグメントが .text セグメントの直後にあると想定していますが、そうではありません。 XIP 組み込みシステム (RAM が分離されている) の場合は true です。

その結果、元のバイナリが 0x60000000 で実行するようにリンクされていた (および 0x20000000 の固定 RAM 領域を使用している) が、代わりに 0x60100000 で実行される場合、RAM アドレスも 0x100000 だけシフトされます (つまり、0x20100000 に)。これは私がまったく望んでいるものではありません。

明らかに、私がやりたいことは、コードへの参照 (QSPI の 2 つの異なる場所でその場で実行) が位置に依存しないように gcc の動作を変更することですが、.data/bss セグメントへの参照は (固定されたRAM 内の位置) は位置に依存します (通常どおり)。

これは、gcc を微調整して達成できるものですか (たとえば、あいまいなリンカ属性フラグによって)? それとも、これは手の届かないところにありますか?ありがとう!