問題タブ [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.
arm - Atmel SAM Cortex-M0+ の位置独立バイナリ
Atmel Studio 7 (arm-none-eabi ?) に含まれる ARM GNU ツールチェーンを使用して、Cortex-M0+ 用の位置に依存しないバイナリを作成しようとしています。これを行う方法について多くの場所を調べましたが、成功していません。これにより、OTA 更新用のローハイ フラッシュ メモリ領域にピンポン イメージを作成することが容易になり、更新がそのユニットのピンポン イメージであるか気にする必要がなくなります。
8 kB のブートローダーが 0x0000 に常駐しており、UART 経由で通信でき、そこでバイナリを検出するとリセット後に 0x6000 (24 kB) にジャンプします (つまり、0xFFFF 消去されたフラッシュではありません)。この SAM-BA ブートローダを使用すると、指定したアドレスにある .bin ファイルを使用して、メモリをダンプし、フラッシュを消去およびプログラムできます。
アプリケーション プロジェクト (単純な LED 点滅) では、リンカ コマンド ラインに -section-start=.text=0x6000 を追加するだけで、ブートローダーによって 0x6000 にプログラムされた後、LED 点滅コードが機能します。0x6000 から始まる 16 進ファイルも確認できます。
位置に依存しないバイナリを作成しようとして、上記のリンカ項目を削除し、コンパイラ、リンカ、およびアセンブラのコマンド ラインに -fPIC フラグを追加しました。しかし、逆アセンブリには次のような絶対分岐アドレスがまだ表示されていると思います。
28e: d001 beq.n 294
その結果、0x6000 にロードした LED 点滅バイナリは、リンカに 0x6000 に配置するように明確に指示しない限り実行されず、目的に反します。逆アセンブリの他の部分で相対ブランチのように見えるものも見られることに注意してください。
21c: 4b03 ldr r3, [pc, #12] ; (22c)
21e: 58d3 ldr r3、[r2、r3]
220: 9301 str r3, [sp, #4]
222: 4798 blx r3
SRAM は常に同じアドレス (0x20000000) にあります。実行可能ファイルを再配置できるようにする必要があるだけです。リンカ コマンド ファイルを変更しておらず、.got のセクションがありません (例: (.got)など)。
このセットアップで位置に依存しないバイナリを作成するために、コンパイラ/アセンブラ/リンカーフラグに加える必要がある特定の変更を誰かに説明してもらえますか? よろしくお願いします。