- 例えば、リンカスクリプトで独自のセクションを定義してライブラリの関数群をそこに配置して、そのセクションの先頭アドレスと終端アドレスを記録しておいて、必要なときにその範囲のメモリをRAMにコピーする、とか?
- 変数や関数へのポインタを集めたテーブルをRAMに置いて、ライブラリ実体を割り当てたRAMのアドレスでテーブルを初期化して、そのテーブルを経由して間接的に呼び出す、とか?
- “位置に依存しないコード”を生成する方法なら自動でやれそう?
-fpicオプションを使うとGlobal Offset Tableを経由して間接的にジャンプするようになるので、そのGOTをRAMに配置して適宜書き換えればできる?- ライブラリ内のグローバル変数を適切に扱うにはもうひと工夫必要そう?
- 参考:https://mcuoneclipse.com/2021/06/05/position-independent-code-with-gcc-for-arm-cortex-m/
- いずれにしても、余計な面倒事が増えるだけでは?
- コンパイラはきちんと最適化してくれるのだろうか
- 少なくとも、デバッグが面倒臭くなるだろうことは想像できる
- これらの考えは「使わない関数でRAMを占拠するくらいなら、間接呼び出しコストを受け入れて適宜入れ替えていくほうが良いのでは?」という疑問が前提なので、通常はこのような方法を取らずに、よく使われる常駐の関数だけをRAMに定義すべきだとは思う
動的ライブラリを組み込み系でやるには?
·
Updated:
Share this post on: