5日目の解析 - HobbyOSs/opennask GitHub Wiki

  • 前回の最後、COFFの問題を解決すると5日目のharib02dまでは実装無しで進めた

makefont

  • hankaku.txt という以下のような形式のファイルを
  • bin2objでリンク可能な形にする必要がある
    • いろいろ書いてますが結局 bin2obj 使いました

wine で変換後のオブジェクトファイルのシグネチャを見てみる

$ wine bin2obj.exe build/projects/05_day/harib02e/hankaku.bin build/projects/05_day/harib02e/hankaku.o _hankaku

またldの出番

  • 最終的に以下のようなCOFFのヘッダーをバイナリに付加する、なにそれめんどくさ
00000000: 4c01 0300 0000 0000 8c10 0000 0900 0000  L...............
00000010: 0000 0000 2e74 6578 7400 0000 0000 0000  .....text.......
00000020: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000030: 0000 0000 0000 0000 2000 1060 2e64 6174  ........ ..`.dat
00000040: 6100 0000 0000 0000 0000 0000 0010 0000  a...............
00000050: 8c00 0000 8c10 0000 0000 0000 0000 0000  ................
00000060: 4000 40c0 2e62 7373 0000 0000 0000 0000  @[email protected]........
00000070: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000080: 0000 0000 0000 0000 8000 10c0

リンカスクリプトの勉強

やり方は3種類ぐらい

  1. objcopy なら一発でそれができそう
-B bfdarch --binary-architecture=bfdarch 
Useful when transforming a raw binary input file into an object file. 
In this case the output architecture can be set to bfdarch. 
This option will be ignored if the input file has a known bfdarch. 
You can access this binary data inside a program by referencing 
the special symbols that are created by the conversion process. 
These symbols are called _binary_objfile_start, _binary_objfile_end and  
_binary_objfile_size. e.g. you can transform a picture file into 
an object file and then access it in your code using these symbols.

-B bfdarch --binary-architecture=bfdarch 
生のバイナリ入力ファイルをオブジェクトファイルに変換する時有用です。
この場合出力アーキはbfdarchでセットできる。このオプションは入力ファイルが
bfdarchで既知のものであれば無視される。
あなたは、この変換処理で作成された特別なシンボルを参照することでプログラム内
のこのバイナリデータにアクセスできる。
これらのシンボルは _binary_objfile_start, _binary_objfile_end, _binary_objfile_size
などで呼ばれる。例えばあなたは画像ファイルをオブジェクトファイルに埋め込み
シンボル経由でソースコードからアクセスできる。

→ いい感じだったけどcoff-i386のアーキが古すぎてDebian標準だとobjcopyの対応アーキに含まれてなかった…

  1. .incbin "hankaku.bin" という命令でバイナリを入れ込む
  2. cat ramelfs | hexdump -v -e '"BYTE(0x" 1/1 "%02X" ")\n"' > ramelfs.ld

次の例は完全なリンカスクリプトです。このスクリプトはリンカにall.oの全てのセクションを読み出してそれを0x10000から開始するoutputaという名前のセクションに書き出すように命令している。foo.oというファイルから入力された.input1というセクションはそのすぐ後の同じセクションに配置される。foo.oというファイルから入力された.input2というセクションはoutputcというセクションに配置される。

SECTIONS {
  outputa 0x10000 :
    {
    all.o
    foo.o (.input1)
    }
  outputb :
    {
    foo.o (.input2)
    foo1.o (.input1)
    }
  outputc :
    {
    *(.input1)
    *(.input2)
    }
}