2013年4月25日木曜日

elfファイルをリロケーションの仕組み 概要

elfファイルをリロケーションする仕組み 概要

はじめに

MMU のあるアーキテクチャは、
MMU での仮想メモリのアドレスを書き換えてしまえばいいのでそれほど面倒なことではない。
簡単に言っちゃえば、elfファイルのロード先アドレスにロードして、そこに ジャンプ してしまう方法ができる。


MMU の無いアーキテクチャは、
中身の elf に含まれる プログラムコード の命令セットなどの中でメモリアドレス指定箇所を1個づつかきかえていく。これがリロケーションって作業なんだ。


リロケーションするためどう書き換えてくか?

たとえば hello.o というオブジェクトファイルがあれば

$ arm-none-eabi-objdump -x hello.o

と実行すると ファイルのセクション情報が表示される。

その中に、"RELOCATION RECORDS FOR ..." と書かれた箇所がある。

...
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
...
これらは elf ファイルに有る、 .text セクション内の実際のデータをに対して、移動先アドレスまでのオフセットを加算すればリロケーションできる。

でも単純に加算すればいいわけではなく、これらは プログラムコード(arm命令セット)になっています。
ですから、プログラムコード(arm命令セット)として適切なビットだけを書き換えなければなりません。

実行するとき

1. elfファイルを分解
2. セクション情報を取得
3. memcpy() でセクションを移動して
4. リロケーション情報をもとにアドレスを書き換え

で、実行先エントリーポイントへジャンプすればプログラムは実行できる。
ってことのようです。



これは仕事じゃないから、そのうち試してみます。





0 件のコメント:

コメントを投稿