簡體   English   中英

a.out中的數據部分

[英]Data section in a.out

這是我執行的一個簡單代碼

int a;
int main()
{
    return 0;
}

然后用gcc編譯后我做了

size a.out

我在bss和數據部分得到了一些輸出...然后我將我的代碼更改為此

int a;
int main()
{
    char *p = "hello";
    return 0;
}

再次當我在編譯后通過大小a.out看到輸出時,數據部分的大小保持不變。但是我們知道字符串hello將在只讀初始化部分中分配內存。那么為什么數據部分的大小保持相同?

#include <stdio.h>

int main()
{
return 0;
}

它給

   text    data     bss     dec     hex filename
    960     248       8    1216     4c0 a.out

當你這樣做

int a;
int main()
{
    char *p = "hello";
    return 0;
}

它給

   text    data     bss     dec     hex filename
    982     248       8    1238     4d6 a.out

那時hello存儲在.rodata ,該地址的位置存儲在char指針p但這里p存儲在堆棧中

和大小不顯示堆棧。 我不確定但.rodata在這里以文本或十進制計算。


當你寫作

int a;
char *p = "hello";
int main()
{
    return 0;
} 

它給

   text    data     bss     dec     hex filename
    966     252       8    1226     4ca a.out

現在這里再次將“hello”存儲在.rodata中,但char指針占用4個字節並存儲在數據中,因此數據增加4

有關詳細信息,請訪問http://codingfreak.blogspot.in/2012/03/memory-layout-of-c-program-part-2.html

實際上,這是一個實現細節。 編譯器按原樣工作。 這意味着只要程序的行為相同,就可以自由地排除它想要的任何代碼。 在這種情況下,它可以完全跳過char* p = "hello"

字符串“hello”在.rodata部分中.rodata

即使總大小沒有改變,也不意味着代碼沒有改變。

我測試了你的例子。 字符串“hello”是一個常量數據,因此它存儲在readonly .rodata部分中。 您可以使用objdump查看此特定部分,例如:
objdump -s -j .rodata <yourbinary>

使用gcc 4.6.1沒有任何選項,我得到了你的第二個代碼:

Contents of section .rodata:
 4005b8 01000200 68656c6c 6f00               ....hello.

由於您不在代碼中使用該char * ,因此編譯器對其進行了優化。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM