bin ファイルと elf ファイルの関係を見てみましょう

目次

今日こんな記事を見かけました: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-03103010-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のものを除いて、真ん中に配置されていることがわかります。.datasection.bin

.symtab .strtab .shstrtabこの 3 つsection含まれていません.binが、 Linux のダイナミック リンクのプロセス全体を分析した長い記事4050-3010=1040から、次の 3 つであることがわかりますsection

  • .symtab: ダイナミック リンクに関連するシンボルを保存するダイナミック シンボル テーブル
  • .strtab: 文字列テーブル。ELF に関連する文字列を保存するために使用されますが、プログラムには直接関係しません。
  • .shstrtab: セグメントテーブルまたはセクション名文字列テーブルですが、プログラムとは直接関係がありません。

ここまでのところ、ファイルに有用な情報がまだ残っていることがわかりますが、なぜダイナミック リンクに関する情報が残っている.binのかはわかりません。後で調べましょう。section.plt .dynsym .dynstr ....bin

おすすめ

転載: blog.csdn.net/qq_48322523/article/details/129891816