【问题标题】:What is c/c++ data segment and stack size?什么是 c/c++ 数据段和堆栈大小?
【发布时间】:2015-12-09 02:40:17
【问题描述】:

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

【问题讨论】:

  • 我会先查看 GCC 文档。
  • 告诉你的链接器打印一个 map 文件。地图文件将列出所有段及其大小。没有标准告诉链接器或编译器如何生成映射文件。您需要查阅工具的文档。
  • 数据段最大尺寸,不知道有没有最大尺寸。有的话就没多大意义。最大堆栈大小:already answered

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


【解决方案1】:

段是一种组织可执行文件所需内容的方法。

数据段通常用于您的可执行文件使用的任何数据(无需从外部源输入)。某些数据段可能包含字符串文字或数字常量。

许多可执行文件使用堆栈来存储函数局部变量、语句块局部变量、返回地址和函数参数。 C 或 C++ 语言不需要堆栈;它只是一个方便的数据结构。

堆栈大小可以是分配给堆栈的容量,也可以是驻留在堆栈上的元素数量,也可以是堆栈占用的内存量。

许多平台都有堆栈的默认大小。由于平台不同,您需要阅读工具的文档以了解如何设置堆栈大小以及默认容量是多少。

【讨论】:

    【解决方案2】:

    如何在使用 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 目标端口]

    【讨论】:

      【解决方案3】:

      让我和你一起做实验:像这样创建文件“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__
      

      用一个平台相关的符号代替你在实验中确定的,如上所述。

      【讨论】:

        猜你喜欢
        • 2015-04-23
        • 2016-02-15
        • 1970-01-01
        • 2018-06-29
        • 2012-04-08
        • 2012-07-26
        • 2015-02-13
        • 2010-12-22
        相关资源
        最近更新 更多