目次
今日こんな記事を見かけました:ELFとBINの違い、情報まとめ
以下の文はまだ少しわかりにくい気がします。特に宛名記号が中にないので混乱します。
bin ファイルは、最も純粋な形式、つまり「シーケンシャル形式」のバイナリ マシン コードです。アセンブリコード順にバイナリ機械語コードに変換されるため、内部アドレスマークはありません。bin はダイレクト メモリ イメージ表現であり、バイナリ ファイル サイズはファイルに含まれるデータの実際のサイズです。BIN ファイルはダイレクトバイナリファイルで、通常プログラマでプログラミングする場合は 00 から始まりますが、これをダウンロードして実行するとコンパイル時のアドレスにダウンロードできます。ベアメタル上で直接実行できます。
それでは、具体的なファイルの内容を見てみましょう。
int main()
{
int n = 3;
n = n + 1;
while (1);
return 0;
}
コンパイル.elf
して変換する.bin
root@iZuf6j3ys5kh5ds5n05sgrZ:~# gcc main.c -o main.elf
root@iZuf6j3ys5kh5ds5n05sgrZ:~# objcopy -O binary -S main.elf main.bin
出力main.bin
内容
00000000 2f 6c 69 62 36 34 2f 6c 64 2d 6c 69 6e 75 78 2d |/lib64/ld-linux-|
00000010 78 38 36 2d 36 34 2e 73 6f 2e 32 00 00 00 00 00 |x86-64.so.2.....|
00000020 04 00 00 00 10 00 00 00 05 00 00 00 47 4e 55 00 |............GNU.|
00000030 02 00 00 c0 04 00 00 00 03 00 00 00 00 00 00 00 |................|
00000040 04 00 00 00 14 00 00 00 03 00 00 00 47 4e 55 00 |............GNU.|
00000050 fe 66 a6 45 24 da 37 c3 92 62 73 f0 e6 f6 29 25 |.f.E$.7..bs...)%|
00000060 e8 2a 3f dd 04 00 00 00 10 00 00 00 01 00 00 00 |.*?.............|
00000070 47 4e 55 00 00 00 00 00 03 00 00 00 02 00 00 00 |GNU.............|
00000080 00 00 00 00 00 00 00 00 02 00 00 00 05 00 00 00 |................|
00000090 01 00 00 00 06 00 00 00 00 00 81 00 00 00 00 00 |................|
000000a0 05 00 00 00 00 00 00 00 d1 65 ce 6d 00 00 00 00 |.........e.m....|
000000b0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
000000c0 00 00 00 00 00 00 00 00 38 00 00 00 20 00 00 00 |........8... ...|
000000d0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
000000e0 1a 00 00 00 12 00 00 00 00 00 00 00 00 00 00 00 |................|
000000f0 00 00 00 00 00 00 00 00 54 00 00 00 20 00 00 00 |........T... ...|
00000100 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000110 63 00 00 00 20 00 00 00 00 00 00 00 00 00 00 00 |c... ...........|
00000120 00 00 00 00 00 00 00 00 0b 00 00 00 22 00 00 00 |............"...|
00000130 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000140 00 6c 69 62 63 2e 73 6f 2e 36 00 5f 5f 63 78 61 |.libc.so.6.__cxa|
00000150 5f 66 69 6e 61 6c 69 7a 65 00 5f 5f 6c 69 62 63 |_finalize.__libc|
00000160 5f 73 74 61 72 74 5f 6d 61 69 6e 00 47 4c 49 42 |_start_main.GLIB|
00000170 43 5f 32 2e 32 2e 35 00 5f 49 54 4d 5f 64 65 72 |C_2.2.5._ITM_der|
# ......
00003ca0 00 00 00 00 00 00 00 00 00 3e 00 00 00 00 00 00 |.........>......|
00003cb0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
00003cf0 08 40 00 00 00 00 00 00 |.@......|
00003cf8
出力main.elf
内容
00000000 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 |.ELF............|
00000010 03 00 3e 00 01 00 00 00 40 10 00 00 00 00 00 00 |..>.....@.......|
00000020 40 00 00 00 00 00 00 00 10 39 00 00 00 00 00 00 |@........9......|
00000030 00 00 00 00 40 00 38 00 0d 00 40 00 1d 00 1c 00 |....@.8...@.....|
00000040 06 00 00 00 04 00 00 00 40 00 00 00 00 00 00 00 |........@.......|
00000050 40 00 00 00 00 00 00 00 40 00 00 00 00 00 00 00 |@.......@.......|
00000060 d8 02 00 00 00 00 00 00 d8 02 00 00 00 00 00 00 |................|
# ......
000002d0 00 00 00 00 00 00 00 00 10 00 00 00 00 00 00 00 |................|
000002e0 52 e5 74 64 04 00 00 00 f0 2d 00 00 00 00 00 00 |R.td.....-......|
000002f0 f0 3d 00 00 00 00 00 00 f0 3d 00 00 00 00 00 00 |.=.......=......|
00000300 10 02 00 00 00 00 00 00 10 02 00 00 00 00 00 00 |................|
00000310 01 00 00 00 00 00 00 00 2f 6c 69 62 36 34 2f 6c |......../lib64/l|
00000320 64 2d 6c 69 6e 75 78 2d 78 38 36 2d 36 34 2e 73 |d-linux-x86-64.s|
00000330 6f 2e 32 00 00 00 00 00 04 00 00 00 10 00 00 00 |o.2.............|
00000340 05 00 00 00 47 4e 55 00 02 00 00 c0 04 00 00 00 |....GNU.........|
00000350 03 00 00 00 00 00 00 00 04 00 00 00 14 00 00 00 |................|
00000360 03 00 00 00 47 4e 55 00 fe 66 a6 45 24 da 37 c3 |....GNU..f.E$.7.|
00000370 92 62 73 f0 e6 f6 29 25 e8 2a 3f dd 04 00 00 00 |.bs...)%.*?.....|
00000380 10 00 00 00 01 00 00 00 47 4e 55 00 00 00 00 00 |........GNU.....|
00000390 03 00 00 00 02 00 00 00 00 00 00 00 00 00 00 00 |................|
000003a0 02 00 00 00 05 00 00 00 01 00 00 00 06 00 00 00 |................|
000003b0 00 00 81 00 00 00 00 00 05 00 00 00 00 00 00 00 |................|
000003c0 d1 65 ce 6d 00 00 00 00 00 00 00 00 00 00 00 00 |.e.m............|
000003d0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
000003e0 38 00 00 00 20 00 00 00 00 00 00 00 00 00 00 00 |8... ...........|
000003f0 00 00 00 00 00 00 00 00 1a 00 00 00 12 00 00 00 |................|
00000400 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000410 54 00 00 00 20 00 00 00 00 00 00 00 00 00 00 00 |T... ...........|
00000420 00 00 00 00 00 00 00 00 63 00 00 00 20 00 00 00 |........c... ...|
00000430 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000440 0b 00 00 00 22 00 00 00 00 00 00 00 00 00 00 00 |...."...........|
00000450 00 00 00 00 00 00 00 00 00 6c 69 62 63 2e 73 6f |.........libc.so|
00000460 2e 36 00 5f 5f 63 78 61 5f 66 69 6e 61 6c 69 7a |.6.__cxa_finaliz|
# ......
00002fc0 00 3e 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |.>..............|
00002fd0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
00003000 00 00 00 00 00 00 00 00 08 40 00 00 00 00 00 00 |.........@......|
00003010 47 43 43 3a 20 28 55 62 75 6e 74 75 20 39 2e 34 |GCC: (Ubuntu 9.4|
# ......
00004030 0c 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00004040 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00004050
.bin
ファイル.elf
内の対応する部分の位置は.elf
であることがわかります0310-3010
が、の位置を持っていません0000-0310
。3010-4050
.bin
.elf
ファイルを表示するsection table
Section Headers:
[Nr] Name Type Address Offset
Size EntSize Flags Link Info Align
[ 0] NULL 0000000000000000 00000000
0000000000000000 0000000000000000 0 0 0
[ 1] .interp PROGBITS 0000000000000318 00000318
000000000000001c 0000000000000000 A 0 0 1
# ......
[22] .got PROGBITS 0000000000003fc0 00002fc0
0000000000000040 0000000000000008 WA 0 0 8
[23] .data PROGBITS 0000000000004000 00003000
0000000000000010 0000000000000000 WA 0 0 8
[24] .bss NOBITS 0000000000004010 00003010
0000000000000008 0000000000000000 WA 0 0 1
[25] .comment PROGBITS 0000000000000000 00003010
000000000000002b 0000000000000001 MS 0 0 1
[26] .symtab SYMTAB 0000000000000000 00003040
00000000000005d0 0000000000000018 27 44 8
[27] .strtab STRTAB 0000000000000000 00003610
00000000000001f0 0000000000000000 0 0 1
[28] .shstrtab STRTAB 0000000000000000 00003800
000000000000010c 0000000000000000 0 0 1
真ん中.interp
のものを除いて、真ん中に配置されていることがわかります。.data
section
.bin
.symtab .strtab .shstrtab
この 3 つはsection
含まれていません.bin
が、 Linux のダイナミック リンクのプロセス全体を分析した長い記事4050-3010=1040
から、次の 3 つであることがわかります。section
.symtab
: ダイナミック リンクに関連するシンボルを保存するダイナミック シンボル テーブル.strtab
: 文字列テーブル。ELF に関連する文字列を保存するために使用されますが、プログラムには直接関係しません。.shstrtab
: セグメントテーブルまたはセクション名文字列テーブルですが、プログラムとは直接関係がありません。
ここまでのところ、ファイルに有用な情報がまだ残っていることがわかりますが、なぜダイナミック リンクに関する情報が残っている.bin
のかはわかりません。後で調べましょう。section
.plt .dynsym .dynstr ...
.bin