我想知道GCC为每个编译单元集合生成了多少目标代码,但是我遇到了一个奇怪的问题,即来自binutils的"size"命令没有给出正确的结果.
我们来看一个只包含这个函数的C文件:
int foo (int a, int b)
{
return a+b;
}
Run Code Online (Sandbox Code Playgroud)
我们可以编译它并使用"size"和"objdump"检查目标代码大小:
$ gcc -O foo.c -c
$ size foo.o
text data bss dec hex filename
52 0 0 52 34 foo.o
$ objdump -d foo.o
foo.o: file format elf64-x86-64
Disassembly of section .text:
0000000000000000 <foo>:
0: 8d 04 37 lea (%rdi,%rsi,1),%eax
3: c3 retq
Run Code Online (Sandbox Code Playgroud)
从objdump输出中可以清楚地看出,目标代码大小是4个字节.但是,大小报告52个字节,这是不正确的.
从使用"-D"选项到objdump,它看起来像异常处理代码,也许其他一些东西正在通过"大小"来衡量,并添加到我真正关心的代码的大小.有没有人知道一个相对简单的方法来获得大小忽略这些额外的东西?
一定要坚持吗size?它有很多与您遇到的问题类似的问题,所以我通常使用以下readelf代码片段:
OBJ=foo.o
SEC=.text
readelf -SW "$OBJ" \
| sed 's/^ *\[[0-9 ]*\] *//' \
| awk '
/NOBITS/ { next; }
/^'$SEC'\>/ { sz = strtonum("0x" $5); s += sz; }
END { print s }'
Run Code Online (Sandbox Code Playgroud)