[英]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.