我试图了解汇编代码到内存空间的确切程度。我写了一个简单的汇编代码,它只包含几行指令和.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部分的内存会发生什么?
答案 0 :(得分:2)
当系统将文件加载到内存中时,它不会在数据部分的末尾停止读取,因为没有理由,并且不会更有效。由于可执行文件说没有任何内容,代码不应该访问它,因此放置一些内容并不重要。它更有效,因为系统可以使用文件系统缓存中的页面而不是复制数据,从而节省了物理内存并避免了复制。
话虽这么说,那是磁盘上数据部分之后的可执行文件的内容。如果您将该额外数据的开头看作字符串,您将看到它是文件中各部分的名称(前两个是“.symtab”和“.strtab”)。之后来自文件的其他信息。这是链接器或加载器用来解析文件的数据,恰好已经放在内存中了。