Open eTakazawa opened 4 years ago
セクションヘッダ:
[番] 名前 タイプ アドレス Off サイズ ES Flg Lk Inf Al
[ 0] NULL 00000000 000000 000000 00 0 0 0
[ 1] .vectors PROGBITS 00000000 000094 000100 00 WA 0 0 4
[ 2] .text PROGBITS 00000100 000194 000654 00 AX 0 0 2
[ 3] .rodata PROGBITS 00000754 0007e8 00009c 00 A 0 0 1
[ 4] .data PROGBITS 00fffc20 000884 000014 00 WA 0 0 4
[ 5] .bss NOBITS 00fffc34 000898 00001a 00 WA 0 0 4
[ 6] .shstrtab STRTAB 00000000 000898 00003d 00 0 0 1
[ 7] .symtab SYMTAB 00000000 000a40 0007b0 10 8 89 4
[ 8] .strtab STRTAB 00000000 0011f0 0002d9 00 0 0 1
Key to Flags:
W (write), A (alloc), X (execute), M (merge), S (strings), I (info),
L (link order), O (extra OS processing required), G (group), T (TLS),
C (compressed), x (unknown), o (OS specific), E (exclude),
p (processor specific)
PROGBITS
がプログラム本体
アドレスは「VA」.そのセクションが動作するアドレス.
プログラムヘッダ:
タイプ オフセット 仮想Addr 物理Addr FileSiz MemSiz Flg Align
LOAD 0x000094 0x00000000 0x00000000 0x00100 0x00100 RW 0x1
LOAD 0x000194 0x00000100 0x00000100 0x006f0 0x006f0 R E 0x1
LOAD 0x000884 0x00fffc20 0x000007f0 0x00014 0x0002e RW 0x1
セグメントマッピングへのセクション:
セグメントセクション...
00 .vectors
01 .text .rodata
02 .data .bss
3章のissueと同じ.
仮想Addr がVAで,物理Addrが PA.
kzload> load
~+ lsx kzload.elf
shell-init: error retrieving current directory: getcwd: cannot access parent directories: Permission denied
Sending kzload.elf, 46 blocks: Give your local XMODEM receive command now.
Bytes Sent: 6016 BPS:658
Transfer complete
XMODEM receive succeeded.
kzload> dump
size: 1780
7f 45 4c 46 01 02 01 00 00 00 00 00 00 00 00 00
00 02 00 2e 00 00 00 01 00 00 01 00 00 00 00 34
セグメントをRAM上に展開 → 処理を渡す(エントリポイント,スタートアドレス)
[takazawa@tk2-231-25262 os]$ readelf -a kozos.elf
ELF ヘッダ:
マジック: 7f 45 4c 46 01 02 01 00 00 00 00 00 00 00 00 00
クラス: ELF32
データ: 2 の補数、ビッグエンディアン
バージョン: 1 (current)
OS/ABI: UNIX - System V
ABI バージョン: 0
型: EXEC (実行可能ファイル)
マシン: Renesas H8/300
バージョン: 0x1
エントリポイントアドレス: 0xffc020 ←エントリポイント
プログラムの開始ヘッダ: 52 (バイト)
セクションヘッダ始点: 1232 (バイト)
フラグ: 0x810000
このヘッダのサイズ: 52 (バイト)
プログラムヘッダサイズ: 32 (バイト)
プログラムヘッダ数: 2
セクションヘッダ: 40 (バイト)
セクションヘッダサイズ: 8
セクションヘッダ文字列表索引: 5
セクションヘッダ:
[番] 名前 タイプ アドレス Off サイズ ES Flg Lk Inf Al
[ 0] NULL 00000000 000000 000000 00 0 0 0
[ 1] .text PROGBITS 00ffc020 000074 0003e4 00 AX 0 0 2 ← すべてRAMに配置されている(0x00ffc***)
[ 2] .rodata PROGBITS 00ffc404 000458 000038 00 A 0 0 1
[ 3] .data PROGBITS 00ffc43c 000490 00000c 00 WA 0 0 4
[ 4] .bss NOBITS 00ffc448 00049c 000020 00 WA 0 0 1
[ 5] .shstrtab STRTAB 00000000 00049c 000034 00 0 0 1
[ 6] .symtab SYMTAB 00000000 000610 000570 10 7 58 4
[ 7] .strtab STRTAB 00000000 000b80 000223 00 0 0 1
Key to Flags:
W (write), A (alloc), X (execute), M (merge), S (strings), I (info),
L (link order), O (extra OS processing required), G (group), T (TLS),
C (compressed), x (unknown), o (OS specific), E (exclude),
p (processor specific)
ELF形式について
gccのデフォルトの出力ファイル形式は
ELF形式
基本これで十分らしい
やりたいのはセグメントの情報をメモリにロードする
セクションとセグメント
セクション
機械語コードや静的変数のデータをそれぞれ一箇所にまとめておく.
基本同じセクションを同じセクションにリンクでこれをまとめる
セグメント
リンク後に生成
「ローダ」がセグメント情報を見てメモリ上へ展開
ELF形式の内部構造