加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 09:59:09 所属栏目:百科 来源:网络整理
导读:我读到它取决于编译器和操作系统架构.如何使用GCC作为编译器在 Linux系统上找出数据段和堆栈最大大小? 解决方法 让我试验一下:创建文件“test.c”,如下所示: int main (void) { return 0; } 现在编译它,指定最大堆栈大小(只是为了在map文件中轻松查找这个
我读到它取决于编译器和操作系统架构.如何使用GCC作为编译器在 Linux系统上找出数据段和堆栈最大大小?

解决方法

让我试验一下:创建文件“test.c”,如下所示:

int main (void) { return 0; }

现在编译它,指定最大堆栈大小(只是为了在map文件中轻松查找这个数字并确定符号名称,引用它):

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__

将平台相关符号替换为该符号,您在实验中确定,如上所述.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读