はじめに
MMU のあるアーキテクチャは、MMU での仮想メモリのアドレスを書き換えてしまえばいいのでそれほど面倒なことではない。
簡単に言っちゃえば、elfファイルのロード先アドレスにロードして、そこに ジャンプ してしまう方法ができる。
MMU の無いアーキテクチャは、
中身の elf に含まれる プログラムコード の命令セットなどの中でメモリアドレス指定箇所を1個づつかきかえていく。これがリロケーションって作業なんだ。
リロケーションするためどう書き換えてくか?
たとえば hello.o というオブジェクトファイルがあれば$ arm-none-eabi-objdump -x hello.o
と実行すると ファイルのセクション情報が表示される。
その中に、"RELOCATION RECORDS FOR ..." と書かれた箇所がある。
...これらは elf ファイルに有る、 .text セクション内の実際のデータをに対して、移動先アドレスまでのオフセットを加算すればリロケーションできる。
RELOCATION RECORDS FOR [.text]:
OFFSET TYPE VALUE
00000094 R_ARM_PC24 main
00000098 R_ARM_PC24 exit
00000144 R_ARM_PC24 msg_send
00000178 R_ARM_ABS32 .rodata
0000014c R_ARM_ABS32 .rodata
000034cc R_ARM_PC24 sys_log
...
でも単純に加算すればいいわけではなく、これらは プログラムコード(arm命令セット)になっています。
ですから、プログラムコード(arm命令セット)として適切なビットだけを書き換えなければなりません。
実行するとき
1. elfファイルを分解2. セクション情報を取得
3. memcpy() でセクションを移動して
4. リロケーション情報をもとにアドレスを書き換え
で、実行先エントリーポイントへジャンプすればプログラムは実行できる。
ってことのようです。
これは仕事じゃないから、そのうち試してみます。
0 件のコメント:
コメントを投稿