【发布时间】:2012-07-09 17:39:57
【问题描述】:
假设我有如下函数:
# cat 003.c
int foo(int a, int b)
{
return a+b;
}
并像这样编译它:
gcc -S 003.c
得到如下组装结果:
.file "003.c"
.text
.globl foo
.type foo, @function
foo:
.LFB2:
pushq %rbp
.LCFI0:
movq %rsp, %rbp
.LCFI1:
movl %edi, -4(%rbp)
movl %esi, -8(%rbp)
movl -8(%rbp), %edx
movl -4(%rbp), %eax
addl %edx, %eax
leave
ret
.LFE2:
.size foo, .-foo /* size of the function foo, how to get it?*/
上面的最后一行确实得到了函数的大小。编译器在哪里存储大小?我可以在我的原始 C 程序中使用 C 或内联 asm 以某种方式获取函数的大小吗?
【问题讨论】:
-
不幸的是
__builtin_object_size不起作用(至少对于 gcc 4.7) -
符号/对象的大小可能是 ELF 符号表的一部分。但要使其在运行时可供程序访问,则需要链接器,当然还有汇编器支持。我还没有看到任何证据表明 GNU 汇编器支持访问符号的大小。我相信 GNU 汇编器和 GNU 链接器根本不支持。大小可能只是符号表的一部分,仅用于调试目的。
标签: c gcc assembly elf gnu-assembler