-
Notifications
You must be signed in to change notification settings - Fork 3
5日目の解析
hangedman edited this page Aug 11, 2023
·
17 revisions
- 前回の最後、COFFの問題を解決すると5日目の
harib02d
までは実装無しで進めた
-
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 @.@..bss........
00000070: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000080: 0000 0000 0000 0000 8000 10c0
やり方は3種類ぐらい
-
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の対応アーキに含まれてなかった…
-
.incbin "hankaku.bin"
という命令でバイナリを入れ込む 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)
}
}