リロケーション情報
Z8k-COFFで拡張され、offsetとstuffが追加されている。
変数名はBFDのコードに合わせたが、用途は不明。
リロケーション情報は、r_vaddrが昇順になるよう並べないと、リンカがsegmentation fault を起こす。
リロケーション情報は、r_vaddrが昇順になるよう並べないと、リンカがsegmentation fault を起こす。
r_vaddr (4 bytes)
リロケーションを行う箇所のセクション先頭からのアドレス。
r_symndx (4 bytes)
シンボル番号
offset (4 bytes)
オフセット+シンボル中の e_value が、リロケーションを行う箇所の値になる。
オフセット+シンボル中の e_value が、リロケーションを行う箇所の値になる。
r_type (2 bytes)
アドレスのタイプ。確認できているのは次の6種類。
外部シンボルをPC相対で参照するケースがあるのか分からないが、
アセンブリ言語でコードを書いてobjdumpで確認すると、これらのタイプが使われている。
内部シンボルへのPC相対アドレスは解決できるので、リロケーション情報にはない。
16bitの短縮セグメントアドレスがあるかは不明。
アセンブリ言語でコードを書いてobjdumpで確認すると、これらのタイプが使われている。
内部シンボルへのPC相対アドレスは解決できるので、リロケーション情報にはない。
16bitの短縮セグメントアドレスがあるかは不明。
0x01 - 16bit オフセットアドレス (ノンセグメント)
0x02 - 8bit PC相対 ( JR )
0x04 - 16bit PC相対 (LDA, LDAR)
0x05 - 12bit PC相対 ( CALR )
0x11 - 32bit セグメントアドレス
0x25 - 7bit PC相対 ( DJNZ )
セクションデータ中のr_vaddrが指すアドレスには、各r_typeごとに次の値が書き込まれている。
0x01 : セクション先頭からの16 bitアドレス
0x02 : セクション先頭を指すPC相対アドレス (v_addrが指す次のアドレスが基点)
0x04 : 0x0000が書かれている。
0x05 : セクション先頭を指すPC相対アドレス (v_addrが指すアドレスが基点)
0x11 : セクション先頭からのセグメント形式でない32bitアドレス
0x25 : 何を指しているのか不明
stuff (2 bytes)
不明 0x5343 "SC" が書かれている。
XOUTとCOFFの両フォーマットがなんとなく理解できたので、これで先に進めます。
まずはシンボルテーブルあたりから変換できそうか試してみるつもりです。