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

标签 c++ linux gcc stack data-segment

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

最佳答案

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

将依赖于平台的符号替换为您在实验中确定的符号,如上所述。

关于c++ - 什么是c/c++数据段和堆栈大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32542041/

相关文章:

c++ - 创建 shared_ptr 到堆栈对象

for 循环末尾的 C++ 段错误

ruby-on-rails - 安装 gems "Error: Permission denied rb_sysopen"Arch Linux 时

linux - 我无法从 'script2.sh' 运行 'script1.sh'(它们在同一文件夹中并具有 755 权限)

linux - Qt Hello World 教程不起作用

gcc - 如何将目标文件添加到每个链接

linux - 安装 ns2 时如何在我的 makefile 中设置 gcc 编译器版本?

c++ - 使用 Boost 序列化双端队列 vector 的问题

php - 使用 sizeof() 将代码从 C++ 移植到 PHP

c - 如何从字符串初始化字符数组,其间具有特殊的十六进制值