Armclang armlink --callgraph函数栈大小显示未知字节的场景咨询
可能导致Armclang armlink栈大小信息缺失的场景
函数包含动态栈分配:如果函数里使用了
alloca()或者C99变长数组(VLA),这类内存是运行时才确定分配大小的,armlink在链接阶段无法提前计算栈使用量,会直接标记为未知,也不会出现在--info=stack的输出中。函数仅通过函数指针被间接调用:如果某个函数没有直接的调用语句(比如作为回调函数、动态注册的处理逻辑),链接器的调用图分析无法追踪到它的调用路径,就会跳过对该函数的栈大小计算。
函数被编译器优化移除:即便没有编译宏保护,静态函数若未被任何代码引用、C++模板函数未被实例化,或者在
-O2/-O3等高优化级别下被完全内联,链接阶段就不会保留该函数的符号,自然不会生成栈大小信息。函数存在递归或循环调用依赖:直接递归调用的函数,或者存在A调用B、B又调用A的循环依赖调用链,链接器无法确定最大栈深度,会放弃计算栈大小,标记为未知。
编译阶段未生成栈分析所需信息:如果编译时未添加
-g(生成调试信息)或-fstack-usage(输出栈使用数据),链接器缺少足够的编译期栈使用细节,对复杂函数的栈大小分析会失效。手写汇编函数未标注栈大小:如果函数是手写汇编实现,且没有使用
.stack伪指令明确声明栈大小,armlink无法自动分析汇编代码的栈使用情况,会显示栈大小未知。
内容的提问来源于stack exchange,提问作者arijit
相关产品推荐
相关产品推荐

