如何计算编译后函数包含静态数据等非代码段内容的完整占用体积?
计算编译后函数完整体积开销的可行方法
核心逻辑是将函数代码段体积,加上其专属关联的非text段静态数据(跳转表、常量字符串、静态常量等)体积,两种常用实现方案如下:
方案1:无需修改编译选项,用原生binutils工具统计
- 先获取函数的代码段基础体积
执行objdump -d -j .text 目标文件.o或者nm -S --defined-only 目标文件.o | grep 函数名,输出中对应函数的size字段即为text段体积,记为基础值。 - 关联函数与其引用的专属静态数据
执行objdump -r 目标文件.o查看重定位条目:所有属于该函数代码范围内的重定位引用,指向的非text段符号如果是该函数专属(编译器生成的这类符号通常会带函数名修饰前缀,或通过readelf -w 目标文件.o的调试信息可确认归属),即为需要统计的关联数据。 - 叠加数据体积
执行nm -S --defined-only 目标文件.o查询上述关联数据符号的size,全部加总到基础值即为函数完整体积。
如果出现多个函数共享同一常量的场景,可根据需求选择按引用次数分摊,或计入所有引用该常量的函数体积中。
方案2:修改编译选项实现一键统计(更适合多函数批量统计场景)
- 编译目标文件时额外添加
-ffunction-sections -fdata-sections参数
加该参数后,编译器会将每个函数的代码放到独立的.text.函数名段,函数专属的静态数据(包括跳转表)会放到对应带函数名后缀的独立段(比如.rodata.函数名、.data.rel.ro.函数名等),不会和其他函数的内容合并。 - 直接统计所有对应段的体积总和
执行readelf -S 目标文件.o,筛选所有段名带.你的函数名后缀的段,将它们的size相加即可直接得到函数的完整体积开销,不需要手动关联重定位信息。
内容的提问来源于stack exchange,提问作者Petr Skocik
相关产品推荐
相关产品推荐

