3日目 bootpack.cをアセンブル - HobbyOSs/opennask GitHub Wiki
概要
osask
は既存のリンカ(ld)を使わず、独自ツールで独自フォーマットの.bim
, .hrb
を作成する
- 先人は、それに対抗するため(?)、
ld
のリンカスクリプトを用いてオブジェクトからそれぞれの形式に変換する道筋を提示している

右が正規なosaskツールで出力したバイナリ
差異のある箇所

bootpack.c
void HariMain(void)
{
fin:
/* ここにHLTを入れたいのだが、C言語ではHLTが使えない! */
goto fin;
}
変換過程(正規版osask)
bootpack.gas
.file "bootpack.c"
.text
.balign 2
.globl _HariMain
.def _HariMain; .scl 2; .type 32; .endef
_HariMain:
pushl %ebp
movl %esp, %ebp
L2:
jmp L2
bootpack.nas
[FORMAT "WCOFF"]
[INSTRSET "i486p"]
[OPTIMIZE 1]
[OPTION 1]
[BITS 32]
[FILE "bootpack.c"]
[SECTION .text]
GLOBAL _HariMain ;
_HariMain: ;
PUSH EBP ; 55 (→ 0x50+rd)
MOV EBP,ESP ; 89e5
L2: ;
JMP L2 ; ebfe
; 残り 55 89e5 5de9 f2ff は?
bootpack.bim
00000000: 0e00 0000 2400 0000 2400 0000 0000 0000 ....$...$.......
00000010: 3400 0000 0000 3100 2900 0000 0000 0000 4.....1.).......
00000020: 0000 0000 5589 e5eb fe55 89e5 5de9 f2ff ....U....U..]...
00000030: ffff 0000 ....
[ .bimファイルの構造(haribote.rulを使った場合) ]
+ 0 : .textサイズ
+ 4 : ファイル中の.textスタートアドレス(0x24 = 36)
+ 8 : メモリロード時の.textスタートアドレス(0x24 = 36)
+12 : .dataサイズ
+16 : ファイル中の.dataスタートアドレス
+20 : メモリロード時の.dataスタートアドレス
+24 : エントリポイント
+28 : bss領域のバイト数
+36 : コード
オフセット |
データ |
意味 |
+ 0 |
0e00 0000 |
.textサイズ |
+ 4 |
2400 0000 |
.textスタートアドレス(file) |
+ 8 |
2400 0000 |
.textスタートアドレス(mem) |
+12 |
0000 0000 |
.dataサイズ |
+16 |
3400 0000 |
.dataスタートアドレス(file) |
+20 |
0000 3100 |
.dataスタートアドレス(mem) |
+24 |
2900 0000 |
エントリポイント |
+28 |
0000 0000 |
bss領域のバイト数 |
+36 |
0000 0000 |
コード |
bootpack.hrb
- 最初〜3100までが書き換わり、5589から後は明確なアセンブラ
[ .hrbファイルの構造 ]
+ 0 : stack+.data+heap の大きさ(4KBの倍数)
+ 4 : シグネチャ "Hari"
+ 8 : mmarea の大きさ(4KBの倍数)
+12 : スタック初期値&.data転送先
+16 : .dataのサイズ
+20 : .dataの初期値列がファイルのどこにあるか
+24 : 0xe9000000
+28 : エントリアドレス-0x20
+32 : heap領域(malloc領域)開始アドレス
+36 : コード
00000000: 0000 3100 4861 7269 0000 0000 0000 3100 ..1.Hari......1.
00000010: 0000 0000 3400 0000 0000 00e9 0900 0000 ....4...........
00000020: 0000 3100 5589 e5eb fe55 89e5 5de9 f2ff ..1.U....U..]...
00000030: ffff 0000 ....
変換過程(不正規版osask)
bootpack.nasm
global HariMain: function
SECTION .text align=1 execute ; section number 1, code
HariMain:; Function begin
push ebp ; 0000 _ 55
mov ebp, esp ; 0001 _ 89. E5
?_001: jmp ?_001 ; 0003 _ EB, FE
; HariMain End of function
SECTION .data align=1 noexecute ; section number 2, data
SECTION .bss align=1 noexecute ; section number 3, bss