什么是c / c ++数据段和堆栈大小?

时间:2015-09-12 18:03:41

标签: c++ linux gcc stack data-segment

我读到它取决于编译器和操作系统架构。如何使用GCC作为编译器在Linux系统上找出数据段和堆栈最大大小?

2 个答案:

答案 0 :(得分:4)

让我试验一下:像这样创建文件``test.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 :(得分:0)

  

如何使用GCC作为编译器在Linux系统上找出数据段和堆栈最大大小?

这些限制可以理解为RLIMIT_DATARLIMIT_STACK资源限制getrlimit

在命令行中,您可以使用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

  

- 筹码储备

     

- 堆栈保留,提交

     

指定要保留(并可选择提交)的内存字节数,以用作此程序的堆栈。默认值为2MB保留,4K已提交。 [此选项特定于链接器的i386 PE目标端口]