2019年10月23日水曜日

Z8k-COFF フォーマット 3

リロケーション情報

Z8k-COFFで拡張され、offsetとstuffが追加されている。
変数名はBFDのコードに合わせたが、用途は不明。
リロケーション情報は、r_vaddrが昇順になるよう並べないと、リンカがsegmentation fault を起こす。

 r_vaddr  (4 bytes)
  リロケーションを行う箇所のセクション先頭からのアドレス。

 r_symndx (4 bytes)
 シンボル番号


 offset (4 bytes)
 オフセット+シンボル中の e_value が、リロケーションを行う箇所の値になる。

 r_type (2 bytes)
 アドレスのタイプ。確認できているのは次の6種類。
 外部シンボルをPC相対で参照するケースがあるのか分からないが、
 アセンブリ言語でコードを書いて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の両フォーマットがなんとなく理解できたので、これで先に進めます。
まずはシンボルテーブルあたりから変換できそうか試してみるつもりです。

0 件のコメント:

コメントを投稿