扒一扒bin文件和elf文件的联系

目录

今天看到这样一篇文章:ELF和BIN的区别,资料整理

感觉以下句子还是有些模糊不清,特别是内部没有地址标记让我感到疑惑

Bin文件是最纯粹的二进制机器代码, 或者说是"顺序格式"。按照assembly code顺序翻译成binary machine code,内部没有地址标记。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.data中间的section被放入了.bin

.symtab .strtab .shstrtab三个section没有被放入.bin,而4050-3010=1040,从一篇长文带你深析Linux动态链接的全过程文中可知该三个section分别是:

  • .symtab:动态符号表,保存了与动态链接相关的符号
  • .strtab:字符串表,用于存储与ELF相关的字符串,但与程序没有直接的关系
  • .shstrtab:段表或者节名字符串表,但与程序没有直接的关系

至此可见,在.bin文件中还是有一些有用的信息,不过不知道为何关于动态链接的section.plt .dynsym .dynstr ...还在.bin中,稍等再研究一下吧

猜你喜欢

转载自blog.csdn.net/qq_48322523/article/details/129891816