目录
今天看到这样一篇文章: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-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
三个section
没有被放入.bin
,而4050-3010=1040
,从一篇长文带你深析Linux动态链接的全过程文中可知该三个section
分别是:
.symtab
:动态符号表,保存了与动态链接相关的符号.strtab
:字符串表,用于存储与ELF相关的字符串,但与程序没有直接的关系.shstrtab
:段表或者节名字符串表,但与程序没有直接的关系
至此可见,在.bin
文件中还是有一些有用的信息,不过不知道为何关于动态链接的section
如.plt .dynsym .dynstr ...
还在.bin
中,稍等再研究一下吧