让我和你一起实验一下:创建文件“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__
将平台相关符号替换为您在实验中确定的符号,如上所述。