2013-09-27 54 views
0

我想了解程序集代碼如何佈局到內存空間。我寫了一個簡單的彙編代碼,其中只包含幾行指令和.data部分。當我用GDB檢查它時,我看到更多的東西超出了數據部分,這是我用objdump -section-header命令看不到的東西。以下是gdb的輸出。Assembly中的.data部分是什麼東西?

(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部分的內存,會發生什麼情況?

+2

鏈接器映射文件怎麼樣?它會告訴你什麼是.data部分,例如從啓動代碼等變量。 –

+0

我可以用objdump或類似工具驗證嗎? – REALFREE

+0

也許你需要調試信息。您必須知道數據段中變量的名稱才能知道它們是什麼。 –

回答

2

當系統將您的文件加載到內存中時,它不會停止在數據部分的末尾讀取,因爲沒有理由,而且效率更高。由於可執行文件中沒有任何內容,因此代碼不應該訪問它,因此將其放在一起並不重要。它更高效,因爲系統可以使用文件系統緩存中的頁面而不是複製數據,這可以節省物理內存並避免複製。

這就是說,這是磁盤上的數據部分之後的可執行文件的內容。如果以字符串的形式查看額外數據的開頭,則會看到它是文件中各節的名稱(前兩個是「.symtab」和「.strtab」)。之後,從文件中獲得其他信息。這是鏈接器或加載器用來解析文件的數據,它恰好存放在內存中。

+0

另一個問題是,比方說,我想比較一些值與數據部分的值。如果條件不檢查數據的結束並繼續比較數據段以外的值,那麼不能保證滿足該條件嗎? – REALFREE

+0

對。如果您閱讀了數據部分的末尾,則無法確定將會出現什麼內容。甚至可能沒有任何東西,這會導致段錯誤。 – ughoavgfhw

相關問題