我讀到它取決於編譯器和操作系統體系結構。如何在使用GCC作爲編譯器的Linux系統上找到數據段和堆棧最大大小?什麼是c/C++數據段和堆棧大小?
回答
段是一種組織你的可執行文件需要的東西的方法。
數據段通常用於您的可執行文件使用的任何數據(不需要從外部源輸入)。一些數據段可能包含字符串文字或數字常量。
許多可執行文件使用堆棧來存儲函數局部變量,語句塊局部變量,返回地址和函數參數。 C或C++語言不需要堆棧;這只是一個方便的數據結構。
堆棧大小既可以是分配給堆棧的容量,也可以是位於堆棧上的元素數量或堆棧佔用的內存量。
許多平臺都有默認的堆棧大小。由於平臺不同,您需要閱讀工具的文檔以瞭解如何設置堆棧大小以及默認容量。
如何在使用GCC作爲編譯器的Linux系統上找到數據段和堆棧最大大小?
這些限制可以被讀作的getrlimit
RLIMIT_DATA
和RLIMIT_STACK
資源限制。
在命令行中,你可以使用ulimit
命令查找您系統的這些限制:
$ ulimit -s # stack
8515
$ ulimit -d # data
unlimited
您可以更改通過修改limits.conf系統限制。
在Linux/X86-32,對於一個新的線程默認堆棧大小爲2兆字節。在NPTL線程實現下,如果程序啓動時RLIMIT_STACK軟資源限制的值不是「unlimited」,則它確定新線程的默認堆棧大小。使用pthread_attr_setstacksize(3),可以在用於創建線程的attr參數中顯式設置堆棧大小屬性,以便獲取除默認值以外的堆棧大小。
而在man ld
:
--stack儲備
--stack儲備,提交
指定的存儲器字節數到後備(和任選提交)是用作此程序的堆棧。默認是2MB保留,4K提交。 [此選項特定於鏈接器的i386 PE目標端口]
讓我試驗一下:創建文件``測試。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__
代平臺相關的符號,你在實驗確定,如上所述。
- 1. 爲什麼堆棧大小有限制?
- 2. 什麼設置堆棧大小?
- 3. 什麼「堆棧無效,堆棧只支持堆棧1和堆棧5」是什麼意思?
- 4. Linux堆棧大小
- 5. Android堆棧大小
- 6. 堆棧= java.lang.StackOverflowError的:堆棧大小8MB
- 7. 什麼是Node.js的默認堆棧大小?
- 8. 1.爲什麼堆棧內存的大小是固定的?
- 9. 片段事務的堆棧大小
- 10. iphone os支持的最大堆大小和堆棧大小是多少?
- 11. 全堆棧,堆棧交換等,什麼是堆棧?
- 12. Tomcat7堆棧大小很小
- 13. 我應該讓堆棧段很大還是堆段很大?
- 14. FreeRTOS STM32鏈接器堆棧大小vs任務堆棧大小
- 15. 什麼是堆棧跟蹤?
- 16. 什麼是InfiniBand堆棧?
- 17. 什麼是硬件堆棧?
- 18. 什麼是堆棧跟蹤
- 19. 什麼是LAMP堆棧?
- 20. 什麼是jQuery堆棧?
- 21. 什麼是Linux堆棧?
- 22. 什麼是「堆棧顛簸」?
- 23. 如果大部分數據都堆在堆棧上,堆棧內存的主要重要性/作用是什麼?
- 24. 爲什麼要減小Java JVM線程堆棧的大小?
- 25. 爲什麼gulp抱怨超過最大調用堆棧大小?
- 26. 爲什麼堆棧被稱爲抽象數據類型。如果堆棧是adt,那麼如何實現堆棧?
- 27. 什麼是函數堆棧滿算法?
- 28. 堆VS數據段VS堆棧分配
- 29. 爲什麼不能創建堆棧大小小於默認大小的線程?
- 30. 什麼是安全堆大小?
我首先看GCC文檔。 – Angew
告訴你的鏈接器打印**地圖**文件。地圖文件將列出所有分段及其大小。告訴鏈接器或編譯器如何生成映射文件沒有標準。您需要查閱工具的文檔。 –
數據段最大大小,如果有最大大小,則不需要。如果有的話沒有多大意義。最大堆棧大小:[已經回答](http://stackoverflow.com/questions/7535994/how-do-i-find-the-maximum-stack-size) – user4581301