2015-09-12 30 views
3

我讀到它取決於編譯器和操作系統體系結構。如何在使用GCC作爲編譯器的Linux系統上找到數據段和堆棧最大大小?什麼是c/C++數據段和堆棧大小?

+1

我首先看GCC文檔。 – Angew

+0

告訴你的鏈接器打印**地圖**文件。地圖文件將列出所有分段及其大小。告訴鏈接器或編譯器如何生成映射文件沒有標準。您需要查閱工具的文檔。 –

+0

數據段最大大小,如果有最大大小,則不需要。如果有的話沒有多大意義。最大堆棧大小:[已經回答](http://stackoverflow.com/questions/7535994/how-do-i-find-the-maximum-stack-size) – user4581301

回答

3

段是一種組織你的可執行文件需要的東西的方法。

數據段通常用於您的可執行文件使用的任何數據(不需要從外部源輸入)。一些數據段可能包含字符串文字或數字常量。

許多可執行文件使用堆棧來存儲函數局部變量,語句塊局部變量,返回地址和函數參數。 C或C++語言不需要堆棧;這只是一個方便的數據結構。

堆棧大小既可以是分配給堆棧的容量,也可以是位於堆棧上的元素數量或堆棧佔用的內存量。

許多平臺都有默認的堆棧大小。由於平臺不同,您需要閱讀工具的文檔以瞭解如何設置堆棧大小以及默認容量。

0

如何在使用GCC作爲編譯器的Linux系統上找到數據段和堆棧最大大小?

這些限制可以被讀作的getrlimitRLIMIT_DATARLIMIT_STACK資源限制。

在命令行中,你可以使用ulimit命令查找您系統的這些限制:

$ ulimit -s # stack 
8515 
$ ulimit -d # data 
unlimited 

您可以更改通過修改limits.conf系統限制。

多在man pthread_create

在Linux/X86-32,對於一個新的線程默認堆棧大小爲2兆字節。在NPTL線程實現下,如果程序啓動時RLIMIT_STACK軟資源限制的值不是「unlimited」,則它確定新線程的默認堆棧大小。使用pthread_attr_setstacksize(3),可以在用於創建線程的attr參數中顯式設置堆棧大小屬性,以便獲取除默認值以外的堆棧大小。

而在man ld

--stack儲備

--stack儲備,提交

指定的存儲器字節數到後備(和任選提交)是用作此程序的堆棧。默認是2MB保留,4K提交。 [此選項特定於鏈接器的i386 PE目標端口]

3

讓我試驗一下:創建文件``測試。C「」是這樣的:

int main (void) { return 0; } 

現在編譯它,指定最大堆棧大小(只是爲了方便查找在地圖文件這個號碼,並確定符號的名稱,指的是):

gcc test.c -o test.x -Wl,--stack=0x20000 -Wl,-Map=output.map 

確定數據大小很簡單:

size -A -d test.x 

你會得到這樣的事情:

section   size   addr 
.text    1880 4299165696 
.data    104 4299169792 
... 

另外``objdump -h test.x''可以正常工作,但結果較少。

這裏有更多部分(不只是代碼和數據),但這裏沒有堆棧信息。爲什麼?由於堆棧大小不是ELF部分,因此只有在程序加載後才能執行。你應該從文件中的部分(平臺而定)符號這樣的閱讀:

$ nm test.x | grep __size_of_stack_reserve__ 
0000000000020000 A __size_of_stack_reserve__ 

這並不奇怪,那大小地址0x20000,因爲它在編譯時指出。

我通過查看編譯期間生成的output.map文件來確定符號名稱。我建議你也先看看它。

下一頁當你有一些未知文件的a.out,只是重複序列:

size -A -d a.out 
nm a.out | grep __size_of_stack_reserve__ 

代平臺相關的符號,你在實驗確定,如上所述。