大会之外的.data部分有什么东西?

时间:2013-09-27 02:25:35

标签: assembly

我试图了解汇编代码到内存空间的确切程度。我写了一个简单的汇编代码,它只包含几行指令和.data部分。当我用GDB检查它时,我看到了更多数据部分以外的东西,我用objdump -section-header命令看不到。下面是gdb的输出。

(gdb) x/100x &data
0x804909c <data>:   0x03020100  0x07060504  0x0b0a0908  0x050e0d0c
0x80490ac <other>:  0x00000000  0x6d79732e  0x00626174  0x7274732e
0x80490bc:  0x00626174  0x7368732e  0x61747274  0x742e0062
0x80490cc:  0x00747865  0x7461642e  0x00000061  0x00000000
0x80490dc:  0x00000000  0x00000000  0x00000000  0x00000000
0x80490ec:  0x00000000  0x00000000  0x00000000  0x00000000
0x80490fc:  0x00000000  0x0000001b  0x00000001  0x00000006
0x804910c:  0x08048074  0x00000074  0x00000027  0x00000000
0x804911c:  0x00000000  0x00000004  0x00000000  0x00000021

.data部分的结尾是0x80490af,但正如你所看到的,除了.data部分之外还有更多的东西,我完全没有任何线索。究竟是什么?他们只是垃圾还是其他什么?如果我尝试访问超出.data部分的内存会发生什么?

1 个答案:

答案 0 :(得分:2)

当系统将文件加载到内存中时,它不会在数据部分的末尾停止读取,因为没有理由,并且不会更有效。由于可执行文件说没有任何内容,代码不应该访问它,因此放置一些内容并不重要。它更有效,因为系统可以使用文件系统缓存中的页面而不是复制数据,从而节省了物理内存并避免了复制。

话虽这么说,那是磁盘上数据部分之后的可执行文件的内容。如果您将该额外数据的开头看作字符串,您将看到它是文件中各部分的名称(前两个是“.symtab”和“.strtab”)。之后来自文件的其他信息。这是链接器或加载器用来解析文件的数据,恰好已经放在内存中了。