0

我试图了解汇编代码在内存空间中的确切布局。我编写了一个简单的汇编代码,其中只包含几行指令和 .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 部分的内存会发生什么?

4

1 回答 1

2

当系统将您的文件加载到内存中时,它不会在数据部分的末尾停止读取,因为没有理由这样做,而且不这样做更有效率。由于可执行文件说什么都不存在,代码不应该访问它,所以放在那里并不重要。它更高效,因为系统可以使用文件系统缓存中的页面而不是复制数据,从而节省物理内存并避免复制。

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

于 2013-09-27T03:00:04.133 回答