当前位置: 技术问答>linux和unix
问下关于elf文件的问题
来源: 互联网 发布时间:2016-05-26
本文导语: 生成了一个elf可执行文件,用readelf文件读取信息如下: Section Headers: [Nr] Name Type Addr Off Size ES Flg Lk Inf Al 0 [ 0] NULL ...
生成了一个elf可执行文件,用readelf文件读取信息如下:
Section Headers:
[Nr] Name Type Addr Off Size ES Flg Lk Inf Al
0 [ 0] NULL 00000000 000000 000000 00 0 0 0
1b [ 1] .text PROGBITS bfc00000 010000 01df00 00 AX 0 0 16
21 [ 2] .rodata PROGBITS bfc1df00 02df00 000b80 00 A 0 0 16
29 [ 3] .reginfo MIPS_REGINFO bfc1ea80 02ea80 000018 18 A 0 0 4
32 [ 4] .rodata.str1.4 PROGBITS bfc1ea98 02ea98 003e7f 01 AMS 0 0 4
41 [ 5] .rodata.cst4 PROGBITS bfc22918 032918 000010 04 AM 0 0 4
4e [ 6] .data PROGBITS bfc22930 032930 0007e0 00 WA 0 0 16
54 [ 7] .data.rel.local PROGBITS bfc23110 033110 0004cc 00 WA 0 0 4
64 [ 8] .data.rel PROGBITS bfc235dc 0335dc 000028 00 WA 0 0 4
6e [ 9] .data.rel.ro PROGBITS bfc23604 033604 000014 00 WA 0 0 4
7b [10] .got PROGBITS bfc23620 033620 000520 04 WAp 0 0 16
80 [11] .u_boot_cmd PROGBITS bfc23b40 033b40 0003d8 00 WA 0 0 4
8c [12] .bss NOBITS bfc23f20 033f18 00551c 00 WA 0 0 16
91 [13] .scommon NOBITS bfc2943c 033f18 000084 00 WA 0 0 4
9a [14] .pdr PROGBITS 00000000 033f18 003480 00 0 0 4
9f [15] .mdebug.abi32 PROGBITS 00000000 037398 000000 00 0 0 1
ad [16] .comment PROGBITS 00000000 037398 000898 00 0 0 1
11 [17] .shstrtab STRTAB 00000000 037c30 0000b6 00 0 0 1
1 [18] .symtab SYMTAB 00000000 038008 002d90 10 19 317 4
9 [19] .strtab STRTAB 00000000 03ad98 0023e2 00 0 0 1
Key to Flags:
W (write), A (alloc), X (execute), M (merge), S (strings)
I (info), L (link order), G (group), x (unknown)
O (extra OS processing required) o (OS specific), p (processor specific)
有20个节区,其中可以看到一些节区在文件中没有记录,如[12] .bss,因为其下一节[13] .scommon在文件中的位置与其相同(off属性),但是用objdump -D可以看到如下内容,
Disassembly of section .bss: //在这里
bfc23f20 :
bfc23f20: 00000000 nop
bfc23f24 :
bfc23f24: 00000000 nop
bfc23f28 :
...
bfc23f30 :
bfc23f30: 00000000 nop
bfc23f34 :
bfc23f34: 00000000 nop
请问文件中没有记录,这些信息怎么得到的,这样的节区包括[12] .bss [13] .scommon
这些代码与程序执行时有关系吗,这些代码是否要下载到内存中,从哪里读出下载
Section Headers:
[Nr] Name Type Addr Off Size ES Flg Lk Inf Al
0 [ 0] NULL 00000000 000000 000000 00 0 0 0
1b [ 1] .text PROGBITS bfc00000 010000 01df00 00 AX 0 0 16
21 [ 2] .rodata PROGBITS bfc1df00 02df00 000b80 00 A 0 0 16
29 [ 3] .reginfo MIPS_REGINFO bfc1ea80 02ea80 000018 18 A 0 0 4
32 [ 4] .rodata.str1.4 PROGBITS bfc1ea98 02ea98 003e7f 01 AMS 0 0 4
41 [ 5] .rodata.cst4 PROGBITS bfc22918 032918 000010 04 AM 0 0 4
4e [ 6] .data PROGBITS bfc22930 032930 0007e0 00 WA 0 0 16
54 [ 7] .data.rel.local PROGBITS bfc23110 033110 0004cc 00 WA 0 0 4
64 [ 8] .data.rel PROGBITS bfc235dc 0335dc 000028 00 WA 0 0 4
6e [ 9] .data.rel.ro PROGBITS bfc23604 033604 000014 00 WA 0 0 4
7b [10] .got PROGBITS bfc23620 033620 000520 04 WAp 0 0 16
80 [11] .u_boot_cmd PROGBITS bfc23b40 033b40 0003d8 00 WA 0 0 4
8c [12] .bss NOBITS bfc23f20 033f18 00551c 00 WA 0 0 16
91 [13] .scommon NOBITS bfc2943c 033f18 000084 00 WA 0 0 4
9a [14] .pdr PROGBITS 00000000 033f18 003480 00 0 0 4
9f [15] .mdebug.abi32 PROGBITS 00000000 037398 000000 00 0 0 1
ad [16] .comment PROGBITS 00000000 037398 000898 00 0 0 1
11 [17] .shstrtab STRTAB 00000000 037c30 0000b6 00 0 0 1
1 [18] .symtab SYMTAB 00000000 038008 002d90 10 19 317 4
9 [19] .strtab STRTAB 00000000 03ad98 0023e2 00 0 0 1
Key to Flags:
W (write), A (alloc), X (execute), M (merge), S (strings)
I (info), L (link order), G (group), x (unknown)
O (extra OS processing required) o (OS specific), p (processor specific)
有20个节区,其中可以看到一些节区在文件中没有记录,如[12] .bss,因为其下一节[13] .scommon在文件中的位置与其相同(off属性),但是用objdump -D可以看到如下内容,
Disassembly of section .bss: //在这里
bfc23f20 :
bfc23f20: 00000000 nop
bfc23f24 :
bfc23f24: 00000000 nop
bfc23f28 :
...
bfc23f30 :
bfc23f30: 00000000 nop
bfc23f34 :
bfc23f34: 00000000 nop
请问文件中没有记录,这些信息怎么得到的,这样的节区包括[12] .bss [13] .scommon
这些代码与程序执行时有关系吗,这些代码是否要下载到内存中,从哪里读出下载
|
.bss段叫附加数据段。这个段的特点是,它声明了多大的空间,但是这些控件不属于可执行程序的一部分,也就
是说,这部分空间不算在程序保存在硬盘上所占的磁盘空间,当加载到内存中去的时候,这个段却是要占用内存
空间的。举个例子,假如你在.bss段里面多申请了1024个字节,那么可执行程序的体积几乎是不变的,而当程序
加载到内存中以后,占用的内存空间却多了1K。另外,这个段里的数据默认的都初始化为0的
.scommon这个段好像不是elf标准里面定义的段,刚刚查了下,是MIPS里面为了存储小容量的共享数据,有利于小
的对象组合到单个可以直接寻址的区域。
是说,这部分空间不算在程序保存在硬盘上所占的磁盘空间,当加载到内存中去的时候,这个段却是要占用内存
空间的。举个例子,假如你在.bss段里面多申请了1024个字节,那么可执行程序的体积几乎是不变的,而当程序
加载到内存中以后,占用的内存空间却多了1K。另外,这个段里的数据默认的都初始化为0的
.scommon这个段好像不是elf标准里面定义的段,刚刚查了下,是MIPS里面为了存储小容量的共享数据,有利于小
的对象组合到单个可以直接寻址的区域。