有关函数大小的信息存储在相应符号(名称)的ELF 属性中。如何以编程方式解析的 C 示例代码位于 Solaris 手册页的底部gelf_getsym(3ELF)
(Linux、*BSD 和 MacOS 中确实存在 libelf,您需要查找结构的st_size
字段GElf_Sym
),但您也可以使用 objdump / elfdump (Solaris) / readelf (Linux) 用于任务:
$ objdump -h -d --section=.text foo3.o
foo3.o:文件格式elf64-x86-64
部分:
Idx 名称大小 VMA LMA 文件关闭 Algn
0 .文本 00000012 0000000000000000 0000000000000000 00000040 2**2
内容、分配、加载、只读、代码
[ ... ]
部分.text的反汇编:
0000000000000000 <foo>:
0: 55 推送 %rbp
1: 48 89 e5 移动 %rsp,%rbp
4: 89 7d fc mov %edi,0xfffffffffffffffc(%rbp)
7: 89 75 f8 移动 %esi,0xffffffffffffff8(%rbp)
a: 8b 45 f8 mov 0xfffffffffffffff8(%rbp),%eax
d: 03 45 fc 添加 0xfffffffffffffffc(%rbp),%eax
10:c9请假
11:c3 回复
这是针对您的代码的未优化编译,而优化版本是:
$ objdump -h -d --section=.text foo3.o
foo3.o:文件格式elf64-x86-64
部分:
Idx 名称大小 VMA LMA 文件关闭 Algn
0 .文本 00000004 0000000000000000 0000000000000000 00000040 2**4
内容、分配、加载、只读、代码
[ ... ]
部分.text的反汇编:
0000000000000000 <foo>:
0: 8d 04 37 lea (%rdi,%rsi,1),%eax
3:c3 retq
注意“大小”从0x12
变为4
? 这就是来自.size
汇编程序指令的内容。
尝试使用内联汇编为您提供函数大小/代码位置的“技巧”不考虑编译器生成的胶水代码(函数入口序言/退出尾声,内联代码生成......),也不考虑编译器重新- 订购内联汇编(gcc 这样做是臭名昭著的),因此相信这一点通常不是一个好主意。最后,这取决于你到底想做什么......
编辑:更多的参考,外部以及stackoverflow:
- 从 gcc 邮件列表中,线程上
sizeof(function)
- sizeof(函数名)返回什么?
- 在 C 中查找函数的大小
- LibELF 示例sourceforge 项目(这是文档/教程)